2017-12-13 5 views
1

rebus.rabbitmq 3.0.0 및 rabbitmq.client 4.1.1을 사용하여 rebus 3.1.5를 사용하고 있습니다. 두 번의 최대 배달 시도로 간단한 재 시도 전략을 사용하도록 구성했습니다. 예외가 발생하는 경우에 대비해 메시지를 다시 보내고 싶습니다. 나는 거래 범위를 사용하지 않는다. 그러나 예외가 발생하면 메시지를 다시 전달하지 않습니다. (오류 대기열에도 없습니다)예외가 발생하면 Rebs 핸들러가 다시 시도하지 않습니다.

이것이 가능하지 않고 HandleMessagesInsideTransactionScope로 rebus를 구성해야하는 경우 put은 핸들러 작업을 완료 할 때까지 내 데이터베이스를 잠급니다.

대단히 감사합니다!

편집 :이 핸들러가 모습입니다 같은 :

public Task Handle(SetCreditInfoCommand command) 
{ 
    return Task.Run(() => { 
     var loanApplication = _loanApplicationRepository.Get(command.LoanApplicationId); 
     try { 
      //something that throws an exception here 
     } 
     catch(Exception ex) 
     { 
      throw ex; 
     } 
    }); 
} 

이 버스가 구성 방법은 다음과 같습니다

var bus = Configure.With(adapter) 
    .Transport(t => t.UseRabbitMq(connectionString, queueName)) 
    .Options(b => b.SimpleRetryStrategy(
      maxDeliveryAttempts: 2, 
      secondLevelRetriesEnabled: true, 
      errorQueueAddress: queueName + "_error" 
    )) 
    .Timeouts(t => t.StoreInSqlServer(dbConnection, "RebusTimeouts", false)) 
    .Start(); 

IoC.GetContainerBuilder().RegisterInstance(bus).As<IBus>(); 

답변

1

내가 트랜잭션 범위를 사용하지 않는

좋다 - 트랜잭션 범위는 gro Rebus 핸들러의 바깥 쪽, 예를 들어, 웹 요청을 처리 할 때.

Rebus 처리기에서 발생하는 모든 항목은 자동으로 함께 그룹화되고 들어오는 메시지의 처리를 포괄하는 트랜잭션 컨텍스트의 일부로 커밋됩니다.

편집 : 질문 작성자는 System.Trasactions.TransactionScope을 의미하며 Rebus는 Rebus.TransactionScopes 패키지를 사용하여 메시지 처리기에 자동으로 적용 할 수 있습니다.

나는 원래 RebusTransactionScope이라고 생각했는데, 이는 자체 메시징 트랜잭션 관리를위한 Rebus의 자체 범위였습니다. 예외라는 메시지가 다시 재 배달을하지 않는 발생합니다

이 이상한 소리 (심지어 오류 큐에 있지 않습니다). 메시지 처리기에서 예외 버블을 제외 시키시겠습니까?


나는 귀하의 질문에 대한 귀하의 의견에서 코드를 추가 - 그것은 그런 식으로 :)

첫째, 당신이 메소드 선언에 async 키워드를 사용하여 코드를 단순화 제안을 읽을 훨씬 쉽게 같은 :

public async Task Handle(SetCreditInfoCommand command) 
{ 
    // (...) 
} 

다음으로, 그 적절한 다시 throw 아니기 때문에 당신이 지금 throw ex을 권장합니다 - 그것은 ex 예외의 스택 트레이스를 파괴 할 것이다.

당신

catch(Exception ex) 
{ 
    throw; 
} 

당신이 절대적으로 예외를 catch하려면해야한다.

public async Task Handle(SetCreditInfoCommand command) 
{ 
    var loanApplication = _loanApplicationRepository.Get(command.LoanApplicationId); 

    //something that throws an exception here 
} 

때문에 -하지만 난 정말 당신이 그들과 함께 일을하고 싶지 않다면 당신이 당신의 수수께끼 핸들러에서 예외를 포착하지 않는 것이 좋습니다 핸들러가이 같은 더 나을 것 같은이 경우, 그것은 나에게 보인다 훨씬 더 명확 해.

두 번째 수준의 시도는 잘 작동되지만 즉시 재시도

를 작동하지 않는 수수께끼가 2 레벨 시도에 직접 점프 같은 그것은 본다? 그걸 어떻게 알아 냈는지 더 말해 줄 수 있어요? 여기에서 예외가 발생 { // 뭔가를 시도 (SetCreditInfoCommand 명령) { 반환 Task.Run (() => { VAR loanApplication = _loanApplicationRepository.Get (command.LoanApplicationId)

+0

공공 작업 핸들 } \t \t \t \t 캐치 (예외 예) { \t \t \t \t \t 던지기 전, \t \t \t \t} \t \t \t}); 어이 –

+0

VAR 버스 = Configure.With (어댑터) .Transport (t => t.UseRabbitMq (ConnectionString을, QUEUENAME)) 의 .options (B => { 나처럼 보인다; \t \t은}이 어떻게 내 손으로 .SimpleRetryStrategy (maxDeliveryAttempts : 2 secondLevelRetriesEnabled : 사실, errorQueueAddress : QUEUENAME + "_error");} ) .Timeouts (t => t.StoreInSqlServer (dbConnection 거짓 "RebusTimeouts")) .Start(); IoC.GetContainerBuilder(). RegisterInstance (버스) .As (); –

+0

위는 제 버스 구성입니다. 두 번째 수준의 재 시도가 정상적으로 작동하지만 즉시 재 시도가 작동하지 않습니다. –

관련 문제