특정 예외에 대한 메시지를 다시 시도하는 대기 시간을 지정하는 방법이 있습니까?메시지를 다시 시도하는 대기 시간을 지정하는 방법이 있습니까?
예. object가 SomethingInProgress 상태에 있으면 SomethignInProgressException을 던지고 40m 후에 다시 시도하려고합니다. 또는 SomethingInProgressEvent를 발생시키고 bus.defer를 사용하는 것이 더 적절합니까?
특정 예외에 대한 메시지를 다시 시도하는 대기 시간을 지정하는 방법이 있습니까?메시지를 다시 시도하는 대기 시간을 지정하는 방법이 있습니까?
예. object가 SomethingInProgress 상태에 있으면 SomethignInProgressException을 던지고 40m 후에 다시 시도하려고합니다. 또는 SomethingInProgressEvent를 발생시키고 bus.defer를 사용하는 것이 더 적절합니까?
Rebus가 second-level retries이라는 개념을 가지고 있지 않은 이유 중 일부입니다.이 기능이 일반적이고 유연한 방식으로 만들어 질 수는 없습니다.
곧 답변을 드리겠습니다. 아니요, 특정 예외에 대한 재시도 사이의 시간을 변경하는 방법은 없습니다 (기본 제공). 실제로, 재 시도 사이의 대기 시간을 구성하는 방법은 없습니다 모두 - 실패한 메시지는 가능한 빨리 재 시도되고 "파이프 막힘"을 피하지 못하면 오류 대기열로 이동합니다. 귀하의 경우에는
, 난 당신이 그런 짓을 제안 : 난 그냥 실제로 컴파일 것을 100 % 특정하지 않고 내 머리 위로를 썼다public void Handle(MyMessage message) {
var headers = MessageContext.GetCurrent().Headers;
var deliveryAttempt = headers.ContainsKey("attempt_no")
? Convert.ToInt(headers["attempt_no"])
: 0;
try {
DoWhateverWithThe(message);
} catch(OneKindOfException e) {
if (deliveryAttempt > 5) {
bus.Advanced.Routing.ForwardCurrentMessage("error");
return;
}
bus.AttachHeader(message, "attempt_no", deliveryAttempt + 1);
bus.Defer(TimeSpan.FromSeconds(20), message);
} catch(AnotherKindOfException e) {
if (deliveryAttempt > 5) {
bus.Advanced.Routing.ForwardCurrentMessage("error");
return;
}
bus.AttachHeader(message, "attempt_no", deliveryAttempt + 1);
bus.Defer(TimeSpan.FromMinutes(2), message);
}
}
...하지만 그것의 요점 메시지의 사용자 정의 헤더에서 수행 한 배달 시도 수를 추적하고, 실패한 각 배달 시도에 대해 적절한 시간 범위로 메시지를 호출하고, 최대 배달 시도 횟수가있을 때 즉시 메시지를 오류 대기열로 전달합니다 초과되었습니다.
나는 그하게 희망 의미 :
이이 작업을 수행하는 방법에 대한 최근의 예는 다음과 같습니다이 답변이 게시 된 이후
public async Task Handle(IFailed<MyMessage> message)
{
var maxAttempts = 10;
var optionalHeaders = new Dictionary<string, string>();
if (message.Headers != null && message.Headers.ContainsKey("attemptNumber"))
{
// increment the attempt number
var attemptNumber = int.Parse(message.Headers["attemptNumber"]);
attemptNumber++;
optionalHeaders.Add("attemptNumber", attemptNumber.ToString());
if (attemptNumber > maxAttempts)
{
// log I give up message, message will move to dead queue
return;
}
}
else
optionalHeaders.Add("attemptNumber", "1");
// if message failed to process, defer processing for 5 minutes and try again
await Bus.Defer(TimeSpan.FromMinutes(5), message.Message, optionalHeaders);
}
AttachHeader 방법은 제거되었습니다. Rebus의 새 버전에서는 헤더가 어떻게 설정됩니까? – neo112
메시지를 보내는'IBus '의 모든 메소드는 이제 옵션 인자'optionalHeaders'를 받아들입니다. 'send (message, new Dictionary {{ "사용자 정의 헤더", "wut"}})' –
mookid8000