2014-08-12 2 views

답변

5

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); 
    } 
} 

...하지만 그것의 요점 메시지의 사용자 정의 헤더에서 수행 한 배달 시도 수를 추적하고, 실패한 각 배달 시도에 대해 적절한 시간 범위로 메시지를 호출하고, 최대 배달 시도 횟수가있을 때 즉시 메시지를 오류 대기열로 전달합니다 초과되었습니다.

나는 그하게 희망 의미 :

+0

AttachHeader 방법은 제거되었습니다. Rebus의 새 버전에서는 헤더가 어떻게 설정됩니까? – neo112

+1

메시지를 보내는'IBus '의 모든 메소드는 이제 옵션 인자'optionalHeaders'를 받아들입니다. 'send (message, new Dictionary {{ "사용자 정의 헤더", "wut"}})' – mookid8000

0

이 작업을 수행하는 방법에 대한 최근의 예는 다음과 같습니다이 답변이 게시 된 이후

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); 
} 
관련 문제