2013-09-24 26 views
1

我有以下情形。如何爲NServiceBus配置分佈式事務

  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) 

爲什麼不是這方面的工作?

+0

你的數據庫事務和.Send()應該自動登記在環境事務中。你沒有使用TransactionScope試過嗎? –

+0

我已經刪除了'TransactionScope',但是如果出於某種原因發送錯誤,數據庫仍然會被排序。到目前爲止,我只是刪除了你所說的交易,因爲發送出錯的可能性太小了,但我真的很想知道應該怎麼做。 –

+0

您是否將總線配置爲事務處理?如果是這樣,我想知道我們是否有一些競爭。 –

回答

1

在分佈式場景中運行時,端點映射需要明確定義接收器隊列所在的機器名稱。當在同一個盒子上運行時,這不是必需的。因此你的映射不應該包含「myserver」而是「myserver @ machinename」。此錯誤與DTC無關。對於將來的問題,總是包括Nservicebus版本號和傳輸層

+0

這不是問題,配置有「myserver @ machinename」,我只是簡化了信息。我想知道問題是否存在,因爲我將客戶端作爲一個asp.net應用程序運行,並且在客戶端上我想要執行所描述的邏輯。 –

+0

您的代碼是否具有該隊列的訪問安全性?您需要爲IIS進程設置訪問該隊列的權限 –

+0

是的,如果我沒有周邊事務,則一切正常。 –