如何为NServiceBus配置分布式事务

时间:2013-09-24 11:48:45

标签: nservicebus

我有以下情况。

  1. 首先写一些内容到db
  2. 在巴士上发送讯息
  3. 我想执行像原子操作那样的操作,即在事务中运行它们但在真正分发时无法使它工作。一切都在本地机器上工作,但是一旦服务在另一台机器上就停止了工作。

    我的代码看起来像这样:

    using(var ts = new TransactionScope())
    {
        // Write something to db
        _bus.Send(SomeMessage);
        ts.Complete();
    }
    

    我已经做了我能想到的一切并找到了有关的信息,例如在启用了入站和出站的客户端,服务器和数据库上启用DTC,将端口DCOM协议设置为5000-6000。我得到的错误是:

     FailedToSendMessageException: "Failed to send message to address: myserver"
    

    并且堆栈跟踪是:

    at NServiceBus.Transports.Msmq.MsmqMessageSender.ThrowFailedToSendException(Address address, Exception ex) in c:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Transports\Msmq\MsmqMessageSender.cs:line 89
    at NServiceBus.Transports.Msmq.MsmqMessageSender.Send(TransportMessage message, Address address) in c:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Transports\Msmq\MsmqMessageSender.cs:line 80
    at NServiceBus.Unicast.UnicastBus.SendMessage(List`1 addresses, String correlationId, MessageIntentEnum messageIntent, Object[] messages) in c:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Unicast\UnicastBus.cs:line 658
    at NServiceBus.Unicast.UnicastBus.SendMessage(Address address, String correlationId, MessageIntentEnum messageIntent, Object[] messages) in c:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Unicast\UnicastBus.cs:line 583
    at NServiceBus.Unicast.UnicastBus.NServiceBus.IBus.Send(Object[] messages) in c:\BuildAgent\work\d4de8921a0aabf04\src\NServiceBus.Core\Unicast\UnicastBus.cs:line 480
    at Rapporteringsregisteret.Web.Controllers.RapporteringController.Post(OpprettRapportering opprettRapportering) in c:\dev\git\Rapporteringsregisteret\src\Rapporteringsregisteret.Web\Controllers\RapporteringController.cs:line 37
    at lambda_method(Closure , Object , Object[] )
    at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)
    at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)
    at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)
    

    为什么这不起作用?

1 个答案:

答案 0 :(得分:1)

在分布式场景中运行时,端点映射需要明确定义接收器队列所在的机器名称。在同一个盒子上运行时,这不是必需的。因此,您的映射不应包含“myserver”,而应包含“myserver @ machinename”。此错误与DTC无关。对于将来的问题,始终包括Nservicebus版本号和传输层