2017-05-03 1 views
3

Rebus에서 두 번째 수준의 재시도 사용 (https://github.com/rebus-org/Rebus/wiki/Automatic-retries-and-error-handling) n 재시도 후 메시지를 오류 대기열로 전달해야합니다.예외가있는 메시지를 Rebus 오류 대기열로 전달하는 방법

_bus.Advanced.Routing.Send("my-queue.error",failedMessage.Message, failedMessage.Message); 

을하지만 실패 메시지에 축적 된 예외는 오류 대기열에있는 실패한 메시지 오히려 쓸모 만들기, 함께 가져되지 않습니다

이 작동합니다.

이상적으로는 ITransport 인스턴스에 걸고처럼 뭔가를 할 것이라고이

await _transport.Send(errorQueueAddress, transportMessage, transactionContext); 

(PoisonQueueErrorHandler에서 : https://github.com/rebus-org/Rebus/blob/333dbedf486acb92bd6c6250755537032c6215fd/Rebus/Retry/PoisonQueues/PoisonQueueErrorHandler.cs)

그러나 해당 인스턴스에 도착하는 명백한 방법이 없습니다.

달성 방법에 대한 아이디어가 있으십니까?

답변

0

두 번째 수준 처리기에서 오류 대기열로 메시지를 전달하는 한 가지 방법은 단순히 예외를 throw하는 것입니다. 두 번째 수준의 재시도에도 일반적으로 n 재 시도가 적용되므로 모든 오류가 계속 발생하면 메시지는 결국 에러 큐

오류 대기열로 메시지를 전달할 때 Rebus의 동작을 실제로 에뮬레이트하려면 ErrorDescription 속성을 통해 Rebus에 포함되었을 가능성이있는 전체 오류 세부 정보를 IFailed<YourMessage>에 가져올 수 있습니다.

메시지를 전달할 때 그런 다음 이러한 헤더를 만들 수 있습니다

var details = failedMessage.ErrorDescription; 

var headers = new Dictionary<string, string> 
{ 
    {Headers.SourceQueue, "your-input-queue"}, 
    {Headers.ErrorDetails, details} 
}; 

을 다음 따라서 완전히 그대로 메시지 ID 및 다른 모든 헤더를 보존, 오류 큐에 에게 전송 메시지를 전달해야합니다

이것이 Rebus의 행동 중 가장 현실적인 에뮬레이션이라고 생각합니다.

관련 문제