2012-02-24 2 views
1

때때로 NServiceBus가 메시지를 받으면 아래 예외가 발생하여 실패합니다. 이로 인해 NServiceBus가 다시 시도됩니다 (최대 재시도 제한이 구성됨). 재시도 중 하나에서 메시지가 성공적으로 처리되는 경우가 있지만 동일한 재 시도로 모든 재 시도가 실패하는 것이 일반적입니다. 이 경우 메시지는 모든 재시도가 실패 할 때 예상대로 오류 대기열로 라우팅됩니다.NServiceBus : "실패한 메시지 처리 완료 이벤트 발생"원인은 무엇입니까?

내 질문은 ... 무엇이이 예외가 처음에 발생합니까? 코드가 스택 추적에 나타나지 않기 때문에 메시지 처리기 코드와 관련이없는 것 같습니다.

  • NServiceBus 버전 : 2.6.0.1504
  • OS : 윈도우 서버 처리기 코드는 .NET 3.5을 대상으로 2003
  • 여기

전체 예외 메시지 및 스택 추적입니다 이전 :

NServiceBus.Unicast.Transport.Msmq.MsmqTransport [(null)] - Failed raising 'finished message processing' event. System.Messaging.MessageQueueException: Cannot enlist the transaction. 
    at System.Messaging.MessageQueue.SendInternal(Object obj, MessageQueueTransaction internalTransaction, MessageQueueTransactionType transactionType) 
    at System.Messaging.MessageQueue.Send(Object obj, MessageQueueTransactionType transactionType) 
    at NServiceBus.Unicast.Transport.Msmq.MsmqTransport.SendMsmqMessage(Message m, String destination) 
    at NServiceBus.Unicast.Transport.Msmq.MsmqTransport.Send(TransportMessage m, String destination) 
    at NServiceBus.Unicast.UnicastBus.SendReadyMessage(Boolean startup) 
    at NServiceBus.Unicast.UnicastBus.TransportFinishedMessageProcessing(Object sender, EventArgs e) 
    at NServiceBus.Unicast.Transport.Msmq.MsmqTransport.OnFinishedMessageProcessing() 
+0

우리는 결국 기존의 데이터베이스 경합 문제의 결과로 발생했음을 발견했습니다. 처리기 코드에서 문제가 발생했을 때 DTC 트랜잭션이 너무 일찍 끝난 것으로 보이는 예외가 발생했습니다. 이로 인해 MSMQ가 사용할 수없는 트랜잭션을 참여시킬 수 없을 때 위의 오류가 발생했습니다. 내가 왜 우리 코드가 왜이 점을 더 분명하게 보이지 않는지에 대한 (곤혹스러운) 세부 사항을 남겨 둘 것입니다. 당신의 도움을 주셔서 감사합니다! –

답변

1

스택 추적에서 NServiceBus.Unicast.UnicastBus.SendReadyMessage (부울 시작) 메서드를 참조하십시오. .

이렇게하면 끝점이 배포자에 연결되었음을 알 수 있습니다. 모든 메시지 처리기가 완료된 후 배포자에 연결된 끝점은 ReadyMessage를 배포자의 제어 대기열로 다시 보내 "나는 그 일을 마쳤습니다. 더 보내십시오!"

이것은 나머지 작업과 동일한 트랜잭션 내에서 발생하기로되어 있지만 분명히 MSMQ 송신은 해당 트랜잭션에 참여하는 데 문제가 있습니다. 이것은 DTC의 문제점을 지적 할 수 있습니다. 트랜잭션에 참여하는 해당 메시지 유형에 대해 메시지 처리기에서 수행중인 작업을 알면 흥미로울 것입니다. 수동으로 커밋을하거나 롤백하는 것이 아닙니다.

+0

도움 주셔서 감사합니다. 아니요, 우리는 트랜잭션 관련 (커밋 또는 롤백) 작업을 수동으로 수행하지 않습니다. 현재 DTC가 어떻게 기여하고 있는지 확인하기 위해 DTC를 조사하고 있습니다. 내가 찾은 것으로 다시 업데이트 할 것입니다. –

+0

대답으로 받아들이면 1)은 유일한 대답이고; 2) 몇 가지 유용한 정보가 제공됩니다. –