2014-01-24 5 views
0

처리기 (로컬 푸른 노동자)에 Bus.SendLocal을 만들려고 노력 트랜잭션의 상태에 대해 유효하지 않습니다작업은 내가 다음 코드가

class ProcessHandler : IHandleMessages<StartProcess> 
{ 
    public IBus Bus { get; set; } 

    public void Handle(StartProcess message) 
    { 
     //some long living process (over 3 min) 

     Bus.SendLocal(new SameMessage()); //get error here 
    } 
} 

오류 메시지 : 작업이 유효하지 않습니다 트랜잭션의 상태.

스택 트레이스 :

System.Transactions.Transaction.EnlistVolatile (IEnlistmentNotification enlistmentNotification, EnlistmentOptions enlistmentOptions)에서 System.Transactions.TransactionState.EnlistVolatile (InternalTransaction의 TX, IEnlistmentNotification enlistmentNotification, EnlistmentOptions의 enlistmentOptions 트랜잭션 atomicTransaction) 에서

* C : \ BuildAgent \ work \ ba77a0c29cee2af1 \ src \ NServiceBus.Azure.Transports.WindowsAzureStorageQueues \ AzureMessageQueueSender.Send (TransportMessage 메시지, 주소 주소) : NServiceBus.Azure.Transports.WindowsAzureStorageQueues.AzureMessageQueueSender.cs : 51 행의 NServiceBus.Unicast에서 .UnicastBus.SendMessage (List 01 사전에 23,149,731,743,2) 라인 NServiceBus.Unicast.HandlerInvocationCache.InvokeHandle (Object 핸들러 오브젝트 메시지)에서 0 : 라인 NServiceBus.Pipeline.Behaviors.LoadedMessageHandlers.b_ 2에서 0은 (handlerInstance에서 오브젝트 메시지) 개체 : 에 NServiceBus.Pipeline.Behaviors.InvokeHandlersBehavior.DispatchMessageToHandlersBasedOnType (IBuilder 빌더의 LogicalMessage toHandle, LoadedMessageHandlers의 loadedHandlers, BehaviorContext 컨텍스트)에 라인 0 : 0에서 라인 NServiceBus.Pipeline.Behaviors.InvokeHandlersBehavior.Invoke (BehaviorContext 콘텍스트 액션 옆)에서 : line 0 NServiceBus.Pipeline.BehaviorChain.InvokeNext (BehaviorContext context) : 행 0 at NServiceBus.Pipeline.BehaviorChain. <> C _DisplayClass1.b_의 0 (0) 0 선에서 NServiceBus.Sagas.SagaPersistenceBehavior.Invoke (BehaviorContext 콘텍스트 액션 옆)에서 : 선 0 NServiceBus.Pipeline.BehaviorChain.InvokeNext (BehaviorContext 컨텍스트)에 : line 0 NServiceBus.Pipeline.BehaviorChain에 있습니다. <> C _DisplayClass1.b_의 0 (0) 0 선에서 NServiceBus.Pipeline.Behaviors.LoadHandlersBehavior.Invoke (BehaviorContext 콘텍스트 액션 옆)에서 : 선 NServiceBus.Pipeline.BehaviorChain.InvokeNext에서 0 (BehaviorContext 컨텍스트) in : line 0 at NServiceBus.Pipeline.BehaviorChain. <> C _DisplayClass1.b_의 0 (0) 0 선에서 NServiceBus.Pipeline.Behaviors.CallbackInvocationBehavior.Invoke (BehaviorContext 콘텍스트 액션 옆)에서 : 선 NServiceBus.Pipeline.BehaviorChain.InvokeNext에서 0 (BehaviorContext 컨텍스트) in : line 0 at NServiceBus.Pipeline.BehaviorChain. <> C _DisplayClass1.b_의 0 (0) 0 선에서 NServiceBus.Pipeline.Behaviors.ApplyIncomingMessageMutatorsBehavior.Invoke (BehaviorContext 콘텍스트 액션 옆)에서 : 선 NServiceBus.Pipeline.BehaviorChain.InvokeNext에서 0 (BehaviorContext 컨텍스트) in : line 0 at NServiceBus.Pipeline.BehaviorChain. <> C _DisplayClass1.b_의 0 (0) 0 선에서 NServiceBus.Pipeline.Behaviors.ExtractLogicalMessagesBehavior.Invoke (BehaviorContext 콘텍스트 액션 옆)에서 : 선 NServiceBus.Pipeline.BehaviorChain.InvokeNext에서 0 (BehaviorContext 컨텍스트) in : line 0 at NServiceBus.Pipeline.BehaviorChain. <> c _DisplayClass1.b_ 0() in : 0 at NServiceBus.Pipeline.Behaviors.RaiseMessageReceivedBehavior.Invoke (BehaviorContext context, 다음 동작) in line 0 at NServiceBus.Pipeline.BelectionChain.InvokeNext (BehaviorContext context) : 행 0 at NServiceBus.Pipeline.BehaviorChain. <> C _DisplayClass1.b_의 0 (0) 0 선에서 NServiceBus.Pipeline.Behaviors.ApplyIncomingTransportMessageMutatorsBehavior.Invoke (BehaviorContext 콘텍스트 액션 옆)에서 : 선 NServiceBus.Pipeline.BehaviorChain.InvokeNext에서 0 (BehaviorContext 컨텍스트) in : line 0 at NServiceBus.Pipeline.BehaviorChain. 에서 <> C _DisplayClass1.b__0() : 라인 NServiceBus.UnitOfWork.UnitOfWorkBehavior.Invoke에서 0 (BehaviorContext 컨텍스트, 액션 옆)에서는 : 라인 0 *

은 어떤 사람이 나를 도와 드릴까요? 감사합니다.

답변

1

Nsb 처리기는 system.transactionscope로 둘러싸여 있습니다. system.transaction-section의 app.config에서 기본 시간 초과를 변경할 수 있습니다. Nsb 유창한 구성에는 트랜잭션 설정이 있습니다. Configure.Transactions.Advanced에는 타임 아웃 설정이있을 수 있습니다.

maxtimeout은 10 분입니다. 작업을 수행하는 경우이를 machine.config에서 변경해야합니다 (Startup-task에서 수행해야 함).

제 H

// 피터