NServiceBus 사용하기 4.3 특정 조건이 발생하면 오류 대기열로 메시지를 보내려고합니다.처음으로 오류 대기열로 메시지 보내기
시나리오는 메시지를 받았을 때이 메시지가 데이터베이스에있는 하나 이상의 항목을 나타내는 것인지 확인합니다. 참조가 여러 개인 경우 AmbiguousItemException
을 던져 잡습니다. 나에게 정확한 정보를 제공 할 책임이있는 사람에게 이메일을 보내야합니다. 이 모든 것을 알아 냈지만이 메시지를 다시 시도하기를 원하지 않습니다. 대신 오류 대기열로 이동시켜야하므로 필요한 정보를 얻으면 nullable 속성을 추가하고 메시지를 처리 대기열에 다시 넣을 수 있습니다. _bus.ForwardCurrentMessageTo("error")
, _bus.Send("error", message)
, _bus.SendLocal(message)
을 사용해 보았습니다. 마지막 하나는 기본적으로 메시지를 무한 루프에 넣습니다. 코드는 이런 종류입니다. 당신이 장기 실행 비즈니스 프로세스를 가지고있는 것처럼
public class MoveToErrorQueue
{
private readonly IBus _bus;
public MoveToErrorQueue(IBus bus)
{
_bus = bus;
}
public virtual void Send(ResubmitMessage message)
{
message.Foo= -1;
_bus.Send("error", message);
}
}
당신이 그것을 묘사하는 것에서 그
try
{
//removed for brevity
}
catch (AmbiguousItemException ex)
{
Log.Error(ex);
sendNotificationCommand.FailureMessage = ex.Message;
_moveToErrorQueue.Send(commandMesage);
}
SendNotification(sendScanningNotificationCommand);
이렇게하면 효과가 있었지만 팀과 이야기 한 후 알림 명령을 대기열에 넣지 않고 메시지 오류를 해결하고 오류 대기열로 이동하기로 결정했습니다. –
알림 명령은 Saga로 바로 돌아올 수 있으며 자체적으로 처리 할 수 있습니다. 그것은 단지 제안이었습니다. 당신은 쉽게 테이블에 레코드를 넣거나 자신에게 이메일을 보낼 수 있습니다. 에러 큐를 어지럽히는 것은 권장되지 않습니다. 그것을 위해 설계된 것이 아닙니다. 나는 그것을 추천하지 않을 것이다. –
참고로, @ColinPear는 오류 대기열이 비즈니스 유효성 검사 오류를 포착해서는 안된다는 의미입니다. –