2013-04-30 69 views
2

我們已經買了很多許可證,做了很多測試,並且有很多promissing結果,並且正處於我們第一次發佈的邊緣:)。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

詳細瞭解我們的實現:

我們使用自定義IManageUnitsOfWork,由於一些遺留問題,這意味着對數據庫沒有DTC呢。我不認爲這可能是原因,但我認爲它值得一提。這是實行:

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(); 
    } 
} 

另外,我們有一個特殊的設置,我們運行1點服務運行,這意味着當我們啓動該服務作爲經銷商,其實有4個分銷商內部運行4周相同的AppDomain。但這些都是公關。定義完全相互隔離。 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()); 

問:

這到底是怎麼回事?

我們是否正在使用NSB,因爲我們正在使用DTC抑制,是否存在MSMQ錯誤或是否存在NSB錯誤?

+0

哪個版本的NServiceBus是這樣的?公共汽車版本3.3.5的 – 2013-04-30 13:15:34

+0

。 – 2013-04-30 13:18:32

+0

工作單位不會參與發送給分銷商的控制消息。控制隊列或控制消息來自工作人員似乎有問題。你可以啓動其中一個工作者並使用Queue Explorer將控制消息轉儲到文件中,以便我們可以看一下? – 2013-04-30 20:35:56

回答