1

我有以下情况。

  1. 首先向数据库写入一些东西
  2. 在总线上发送消息

我想像原子动作一样执行那些动作,也就是说,在事务中运行它们,但在真正分布时无法让它工作。一切都在本地机器上正常工作,但是一旦服务在另一台机器上它就停止工作。

我的代码看起来像这样:

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)

为什么这不起作用?

4

1 回答 1

1

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

于 2013-09-24T21:06:32.140 回答