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