2014-09-02 41 views
1

我有一個目前拋出的程序MSMQ事務還沒有開始。如果此事務用於發送而沒有任何警告或異常,MSQM將把消息放入死信隊列中!異常。我不確定我做了什麼錯誤,所以無論如何調試/記錄消息隊列事務的當前狀態?反正有調試/日誌消息隊列事務嗎?

基本上,我目前有:

DoSomething(); // may have problem here 

using (var scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted, Timeout = TransactionManager.DefaultTimeout })) 
{ 
    // throws exception here, but I believe the above method does something wrong 
    bus.Publish(new SomethingHappened(1, "test")); 

    scope.Complete(); 
} 
+0

好的。我可以使用TransactionContext.Current獲取當前事務上下文。 MessageQueueTransactionStatus已提交。所以我不知道爲什麼它不被清理? – Yin 2014-09-02 04:15:08

+0

你能顯示你的總線配置嗎? – user1121956 2014-09-02 11:58:43

+0

和DoSomething()做什麼,如果你說它可能會導致問題,你有沒有試圖避免它? – user1121956 2014-09-02 11:59:53

回答

2

我「成功」在我的機器上再現的問題,但我必須承認,我是一個在黑暗至於如何解決它。

似乎MSMQ以某種方式登記在環境交易中,即使我小心地手動創建MsmqTransaction,我將其用於所有發送/接收操作。

我的信念是,你有你指定MsmqTransactionMode.Auto MSMQ自動登記,我絕對相信我不知道。

我會再討論一些,我甚至可以看到我是否可以讓MSMQ停止這種行爲,但我不能保證我可以解決您的問題。

感謝您報告它,並感謝徹底的再現。

+0

感謝您花時間調查此問題。我目前通過每次請求新的事務範圍來發布消息來解決此問題。我只是好奇這是如何在RabbitMQ中表現出來的? – Yin 2014-09-09 12:06:21

+0

如果RabbitMQ與'TransactionScope'有任何問題,我會感到非常驚訝 - Rebus與環境事務的所有交互都由我編碼,並且我明確避免自動登記以避免排隊事務的DTC升級。所有Rebus的隊列保證都基於這樣的事實:隊列事務總是圍繞着你的代碼所做的任何工作,這就是如何實現至少一次保證 – mookid8000 2014-09-09 12:27:15