2013-04-30 5 views
2

우리는 많은 라이선스를 구입했으며 많은 결과를 약속하며 많은 테스트를 거쳤으며 첫 출시일 직전에 있습니다. :)NServiceBus - 배포자 제어 메시지 오류

그러나 지금 우리는 길에서 큰 충돌을 쳤습니다. 우리가 설명하고 고칠 수 없다면 버스를 버려야 할 수도 있습니다.

우리의 대리점 갑자기 아래와 같은 제어 오류 메시지가 :

<?xml version="1.0"?> 
<ArrayOfHeaderInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <HeaderInfo> 
     <Key>NServiceBus.ControlMessage</Key> 
     <Value>True</Value> 
    </HeaderInfo> 
    <HeaderInfo> 
     <Key>NServiceBus.Distributor.WorkerCapacityAvailable</Key> 
     <Value>20</Value> 
    </HeaderInfo> 
    <HeaderInfo> 
     <Key>NServiceBus.Distributor.WorkerStarting</Key> 
     <Value>True</Value> 
    </HeaderInfo> 
    <HeaderInfo> 
     <Key>CorrId</Key> 
     <Value>58dd98f5-9ac0-44fb-8604-3a0f06787a35\295075</Value> 
    </HeaderInfo> 
    <HeaderInfo> 
     <Key>NServiceBus.ExceptionInfo.Reason</Key> 
     <Value>ProcessingFailed</Value> 
    </HeaderInfo> 
    <HeaderInfo> 
     <Key>NServiceBus.ExceptionInfo.ExceptionType</Key> 
     <Value>System.InvalidOperationException</Value> 
    </HeaderInfo> 
    <HeaderInfo> 
     <Key>NServiceBus.ExceptionInfo.HelpLink</Key> 
    </HeaderInfo> 
    <HeaderInfo> 
     <Key>NServiceBus.ExceptionInfo.Message</Key> 
     <Value>Property ResponseQueue was not retrieved when receiving the message. Ensure that the PropertyFilter is set correctly.</Value> 
    </HeaderInfo> 
    <HeaderInfo> 
     <Key>NServiceBus.ExceptionInfo.Source</Key> 
     <Value>NServiceBus.Core</Value> 
    </HeaderInfo> 
    <HeaderInfo> 
     <Key>NServiceBus.ExceptionInfo.StackTrace</Key> 
     <Value> at NServiceBus.Unicast.Transport.Transactional.TransactionalTransport.ProcessMessage(TransportMessage m) in c:\BuildAgent\work\nsb.master_6\src\impl\unicast\transport\NServiceBus.Unicast.Transport.Transactional\TransactionalTransport.cs:line 312 
    at NServiceBus.Unicast.Transport.Transactional.TransactionalTransport.ReceiveMessage() in c:\BuildAgent\work\nsb.master_6\src\impl\unicast\transport\NServiceBus.Unicast.Transport.Transactional\TransactionalTransport.cs:line 275 
    at NServiceBus.Utils.TransactionWrapper.RunInTransaction(Action callback, IsolationLevel isolationLevel, TimeSpan transactionTimeout) in c:\BuildAgent\work\nsb.master_6\src\utils\TransactionWrapper.cs:line 32 
    at NServiceBus.Unicast.Transport.Transactional.TransactionalTransport.Process() in c:\BuildAgent\work\nsb.master_6\src\impl\unicast\transport\NServiceBus.Unicast.Transport.Transactional\TransactionalTransport.cs:line 220</Value> 
    </HeaderInfo> 
    <HeaderInfo> 
     <Key>NServiceBus.OriginalId</Key> 
     <Value>58dd98f5-9ac0-44fb-8604-3a0f06787a35\295075</Value> 
    </HeaderInfo> 
    <HeaderInfo> 
     <Key>NServiceBus.FailedQ</Key> 
     <Value>[email protected]</Value> 
    </HeaderInfo> 
    <HeaderInfo> 
     <Key>NServiceBus.TimeOfFailure</Key> 
     <Value>2013-04-30 10:07:40:750707 Z</Value> 
    </HeaderInfo> 
</ArrayOfHeaderInfo> 

구글이 일부 스레딩 문제에 관련하고 NSB 수신/PEEK를 사용하여 구현되는 것을 어쩌면 길 수도 있음을 알려줍니다.

위의 예외는 GitHub의에서이 파일 관련 : 우리의 구현에 대한 https://github.com/NServiceBus/NServiceBus/blob/master/src/impl/unicast/transport/NServiceBus.Unicast.Transport.Transactional/TransactionalTransport.cs

세부 사항 :

우리는 때문에 아직 DB에 대한 더 DTC를 의미 일부 레거시 문제로, 사용자 정의 IManageUnitsOfWork를 사용합니다. 나는 이것이 원인 일 수 있다고 생각하지 않지만 나는 그 가치가 있다고 생각한다. 우리는 우리가 유통과 서비스를 시작할 때, 실행 4 개 유통 업체가 실제로 있다는 것을 의미 한 서비스 실행, 내부 4 동일한 응용 프로그램 도메인을 실행할 경우

public class ManagedUnitOfWorkWithDtcSuppression : IManageUnitsOfWork 
{ 
    private readonly IContainer _container; 
    private IUnitOfWork _unitOfWork; 
    private readonly TransactionScope _scope; 

    public ManagedUnitOfWorkWithDtcSuppression() 
    { 
     _scope = new TransactionScope(TransactionScopeOption.Suppress); 
     _container = ObjectFactory.GetInstance<IContainer>(); 
    } 

    public void Begin() 
    { 
     _unitOfWork = _container.GetInstance<IUnitOfWork>(); 
    } 

    public void End(Exception exception = null) 
    { 
     if (exception == null) 
     { 
      _unitOfWork.Commit(); 
     } 

     _unitOfWork.Dispose(); 
     _scope.Complete(); 
     _scope.Dispose(); 
    } 
} 

는 또한 우리가 특별한 설정을 가지고 :이 된 구현입니다. 그러나 이것들은 pr입니다. 정의는 서로 완전히 격리되어 있습니다. IBus는 각 AppDomain마다 고유하며 테스트를 거쳤습니다.

우리의 배포자 구성은 다음과 같습니다

 return NServiceBus.Configure.With() 
      .DefineEndpointName(queuePrefix) 
      .Log4Net(ObjectFactory.GetInstance<IServiceBusLog>().Build()) 
      .StructureMapBuilder() 
      .JsonSerializer() 
      .AsMasterNode() 
      .RunDistributorWithNoWorkerOnItsEndpoint() 
      .MsmqTransport() 
      .IsTransactional(true) 
      .DisableTimeoutManager() 
      .DisableSecondLevelRetries() 
      .UnicastBus() 
      .CreateBus() 
      .Start(() => NServiceBus.Configure.Instance.ForInstallationOn<NServiceBus.Installation.Environments.Windows>().Install()); 

질문 : 여기

을 무슨 일이야?

우리는 DTC supression을 사용하고 있기 때문에 NSB가 필요합니까? MSMQ 버그가 있습니까? 아니면 NSB 버그가 있습니까?

+0

NServiceBus의 버전은 무엇입니까? –

+0

버스 버전 3.3.5. –

+0

작업 단위는 분배기로가는 제어 메시지에 대해 작동하지 않습니다. 작업 큐에서 나오는 제어 대기열이나 제어 메시지에 문제가있는 것 같습니다. 작업자 중 한 명을 시작하고 대기열 탐색기를 사용하여 제어 메시지를 파일로 덤프하여 살펴볼 수 있습니까? –

답변

관련 문제