2014-09-02 5 views
1

현재 throw하는 프로그램이 있습니다 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가 Committed입니다. 그래서 나는 그것이 정리되지 않은 이유를 모른다. – Yin

+0

버스 구성을 보여줄 수 있습니까? – user1121956

+0

DoSomething()이 문제를 일으킬 수 있다고 말하는 경우 DoSomething()이 수행하는 작업은 무엇입니까? – user1121956

답변

2

나는 "성공적으로"내 컴퓨터에서 문제를 재현했습니다,하지만 난 그것을 해결하는 방법에 관해서 어둠 속에서 나는 것을 인정해야합니다.

MSMQ는 마치 수동으로 MsmqTransaction을 생성하는 데 신경 써야하지만 대기 트랜잭션에서 MSMQ를 사용하는 것처럼 보입니다. 모든 보내기/받기 작업에 사용합니다.

내 믿음은 MSMQ가 자동 등록되도록 MsmqTransactionMode.Auto을 지정했다는 것입니다. 나는 확신하지 못합니다.

나는 MSMQ가 그런 식으로 행동하지 못하게 할 수 있는지 볼 수도 있지만 문제를 해결할 수 있다고 약속 할 수는 없습니다.

신고 해 주셔서 감사 드리며 철저히 재현 해 주셔서 감사합니다.

+0

시간을내어 조사 해 주셔서 감사합니다. 현재이 문제를 해결하기 위해 메시지를 게시 할 때마다 새 트랜잭션 범위를 요청합니다. RabbitMQ에서 이것이 어떻게 작동하는지 궁금합니다. – Yin

+0

RabbitMQ에 'TransactionScope'에 문제가있는 경우 놀랄 것입니다. Rebus와 주변 트랜잭션의 상호 작용은 모두 코딩되고 대기열 트랜잭션의 DTC 에스컬레이션을 피하기 위해 자동 참여를 명시 적으로 피할 수 있습니다. . Rebus의 모든 대기열 보장은 코드가 수행하는 작업이 항상 대기열 트랜잭션을 둘러 쌉니다. 이는 최소한 once_-guarantee가 달성되는 방법입니다 – mookid8000