2013-10-03 2 views
3

내 ID를 로그에 기록 할 수 있도록 내 처리기 안에 msmq 메시지의 ID를 가져와야합니다.NServiceBus를 사용하여 MSMQ 메시지의 Id 속성 얻기

메시지가 오류 대기열로 보내지면 실패한 메시지를 알리는 전자 메일이 전송됩니다. 메시지의 원인이 된 오류가 해결되면 'ReturnToSourceQueue'NServiceBus 도구를 사용하여 해당 메시지를 다시 시도해야합니다. 이 ID를 로깅하지 않으면 메시지 대기열을 볼 때 어떤 메시지인지 추적하기가 어려울 수 있습니다.

내가 본 모든 곳에서 Bus.CurrentMessageContext.Id는 ComputerManagement -> 서비스 및 응용 프로그램 -> 메시지 큐 -> 큐에서 큐를 볼 때 메시지 ID 열에 동일한 ID를 제공함을 제안합니다. [일부 큐 ] -> 대기열 메시지. 그러나 이러한 ID는 같지 않습니다.

무엇이 누락 되었습니까?

답변

3

MMC 플러그인이나 큐 탐색기에서 볼 수있는 메시지 ID가 다른 이유는 메시지가 오류 대기열로 "이동"될 때 실제로 발생하는 것은 동일한 MSMQ 메시지가 동일한 본문 헤더 및 오류 대기열로 보내집니다.

또한 메시지 처리가 실패하면 NServiceBus가 이미이 메시지를 기록하고 메시지 ID를 포함하므로 이미 완료되었습니다.

기록 된 ID를 가져 와서 ReturnToSourceQueue 도구로 전달하면 모든 것이 올바르게 작동합니다.

마지막 퍼즐 조각은 메시지가 실패 할 때 이메일을 보내는 것입니다. 이제 데이터베이스가 오프라인이되거나 제 3 자 웹 서비스가 응답하지 않을 때 운영 팀을 스팸으로 몰아 넣을 수 있다는 생각이 듭니다. 그래도 그게 네가하고 싶은 일이라면, 오류가 기록 된 때 이메일 첨부기를 사용하는 것이 좋습니다.

마지막으로 NServiceBus 주변의 Particular Service Platform에 이러한 종류의 알림 기능을 구현하는 중입니다. 우리는 UI에 오류를 표시하고 11 월 13 일에 베타 버전으로 메시지를 다시 처리 할 수있게하고 알림 기능은 연말에 준비 될 것입니다.

정말 기다리고 싶은지, 아니면 직접 제작하고 싶은지에 대한 질문입니다.

+0

답장을 보내 주셔서 감사합니다. 그러나 메시지가 오류 대기열로 이동되지 않은 경우에도 - 처리 대기열에있는 ID를 사용 중지하면 이벤트 처리기에서 일시 중지하고 bus.currentmessagecontext.Id를 볼 때 Id가 동일하지 않습니다. . 또한 NSB가 로그 할 때 처리되는 각 메시지에 대해 다른 로그를 작성합니까? –

+0

NServiceBus와 함께 사용하기 위해 이전 버전의 데몬을 업데이트하려고합니다. 기존의 로깅을 플랫 파일로 처리하는 것이 꽤 있습니다. (그대로 유지하고 메시지 ID 같은 것을 로그에 추가하려고합니다.) 우리는 ' 데이터베이스가 다운 된 경우에도 메시지를 전송할 수 없기 때문에 스패밍에 대해 그렇게 걱정하지 않아도됩니다. 나 자신을 직접 구축하지는 않겠지 만 곧 생산에 착수해야합니다. ( –

+0

방향 앞으로 우리는 NServiceBus와 함께 갈 것이므로 MSMQ 메시지 ID와 점점 더 거리를 두어야 할 필요가 있으므로 코드를 작성하는 것을 피하십시오. 이제 ServiceInsight 도구는 NServiceBus 메시지 ID 대신에 NServiceBus 메시지 ID를 표시합니다. 전송 레벨 ID - 어쩌면 시작해야합니다. –

0

그냥 처리기에서 버스의 인스턴스를 생성 :

public IBus Bus { get; set; } 

그런 다음 메시지 ID를 얻기 위해 그것을 사용 핸들러가 호출 될 때

this.Bus.CurrentMessageContext.Id 

버스 인스턴스가 주입됩니다.

편집

실제로 질문을 읽고 이제

...

CurrentMessageContext.Id가 CorrId 필드에서 메시지 헤더에 무엇을 반환합니다. 이는 서버 관리의 레이블 열에서 볼 수 있습니다.

MessagId 열에 표시된 메시지 ID는 보내는 컴퓨터에 있던 메시지 ID입니다. CurrentMessageContext에서이 값에 액세스하는 방법을 모르지만 로컬 메시지를 찾으려면이 작업을 수행하지 않아도됩니다.

+0

나는 당신이 성급하게 대답했을 것이라고 생각합니다 ... 질문의 마지막 단락을보십시오. – MattDavey

+1

네 말이 맞아. 내 대답을 업데이트했습니다 –

+0

NSB 4.0에서 레이블에 상관 ID가 더 이상 포함되지 않는다고 생각합니다. 그것은 비어 있습니다. 어쨌든, 나는 지역 메시지를 잘 찾을 수있다. 아이디어는 로그를 사용하여 메시지를 연결하는 일종의 ID (관리 스냅인을 보았을 때)를 갖는 것입니다. –

관련 문제