我有以下情形。如何爲NServiceBus配置分佈式事務
- 第一次寫東西到一個數據庫上總線
- 發送消息
我想執行那些像一個原子操作,也就是說,在一個事務中運行他們,但它不能得到當它真正分佈時工作。本地機器上的所有功能都在工作,但一旦服務在另一臺機器上停止工作。
我的代碼看起來是這樣的:
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)
爲什麼不是這方面的工作?
你的數據庫事務和.Send()應該自動登記在環境事務中。你沒有使用TransactionScope試過嗎? –
我已經刪除了'TransactionScope',但是如果出於某種原因發送錯誤,數據庫仍然會被排序。到目前爲止,我只是刪除了你所說的交易,因爲發送出錯的可能性太小了,但我真的很想知道應該怎麼做。 –
您是否將總線配置爲事務處理?如果是這樣,我想知道我們是否有一些競爭。 –