2014-09-02 1 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

+0

Вы можете показать конфигурацию своей шины? – user1121956

+0

и что делает DoSomething(), если вы говорите, что это может вызвать проблемы, пытались ли вы его избежать? – user1121956

ответ

2

Я «успешно» воспроизведен вопрос на моей машине, но я должен признать, что я нахожусь в темноте по отношению к тому, как это исправить.

Кажется, что MSMQ каким-то образом завершает транзакцию, хотя я стараюсь создать вручную MsmqTransaction, который я использую для всех операций отправки и получения.

Я убежден, что вы указали MsmqTransactionMode.Auto для MSMQ для автоматического зачисления, который я абсолютно уверен, что я этого не делаю.

Я покажу еще немного, и я даже могу увидеть, могу ли я заставить MSMQ прекратить вести себя так, но я не могу обещать, что могу исправить вашу проблему.

Спасибо за сообщение об этом, и спасибо за тщательное воспроизведение.

+0

Спасибо, что нашли время, чтобы исследовать это. В настоящее время я работаю над этим, каждый раз запрашивая новую область транзакций для публикации сообщений. Мне просто интересно, как это происходит в RabbitMQ? – Yin

+0

Я был бы очень удивлен, если бы у RabbitMQ была какая-то проблема с «TransactionScope» - все взаимодействие Rebus с внешней транзакцией было закодировано мной, и я явно избегаю автозавершения, чтобы избежать эскалации транзакции в очереди DTC , Все гарантии очереди Rebus основаны на том факте, что транзакция в очереди всегда окружает любую работу, выполняемую вашим кодом, а именно, как достигается гарантия _at минимум once_-warranty – mookid8000

 Смежные вопросы

  • Нет связанных вопросов^_^