2014-12-24 3 views
0

데드 레터 채널 (이 경우에는 activemq 대기열)에 메시지를 보내기 전에 여러 번 메시지를 다시 시도하는 camel 경로에서 errorHandler를 설정했습니다. 내가 원하는 것은 메시지가 최대 횟수만큼 재 시도되지 않고 배달 못 한 편지 큐로 보내 졌을 때 ERROR 로그를 보는 것입니다.Camel의 RedeliveryPolicy retriesExhaustedLogLevel을 구성하는 방법은 무엇입니까?

오류 처리 및 데드 레터 채널에 대한 문서를 보면 RedeliveryPolicy에서 사용할 수있는 두 가지 옵션 인 retriesAttemptedLogLevel 및 retriesExhaustedLogLevel이있는 것으로 보입니다. 아마도 기본적으로 retriesExhaustedLogLevel은 LoggingLevel.ERROR에 이미 설정되어 있지만 모든 재시도 횟수를 소비하고 메시지를 데드 레터 채널로 라우팅 할 때 실제로 아무것도 기록하지 않는 것으로 보입니다.

여기에 Java DSL을 통한 errorHandler 정의가 나와 있습니다.

.errorHandler(this.deadLetterChannel(MY_ACTIVE_MQ_DEAD_LETTER) 
    .useOriginalMessage() 
    .maximumRedeliveries(3) 
    .useExponentialBackOff() 
    .retriesExhaustedLogLevel(LoggingLevel.ERROR) 
    .retryAttemptedLogLevel(LoggingLevel.WARN)) 

레벨을 명시 적으로 ERROR로 설정했지만 로그 아웃 레벨에 아무 것도 로그 아웃하지 않는 것으로 나타납니다. 반면에 retryAttemptedLogLevel은 정상적으로 작동하며 적절한 LoggingLevel에 로그합니다 (예 : retryAttemptedLogLevel을 LoggingLevel.ERROR로 설정하고 재 시도를 ERROR 로그로 볼 수 있음). 그러나 나는 후속 재시도가 잠재적으로 성공할 수있을 때마다 각 재 시도마다 ERROR 로그 대신 고갈이 발생한 경우에만 단일 ERROR 로그 만 원합니다.

아마도 뭔가 빠졌지 만 retriesExhaustedLogLevel은 아무 것도하지 않거나 ErrorHandler가 DeadLetterChannel로 구성된 경우 아무 것도 기록하지 않는 것 같습니다. 여전히 필요한 구성이 있습니까? 아니면이 특정 ErrorHandlerFactory에 대해 RedeliveryPolicy의이 기능이 실행되지 않습니까?

데드 레터 채널에 로그하고 라우팅하는 소모 된 메시지를 보낼 경로를 설정할 수도 있지만 가능한 경우 이미 내장되어있는 것을 사용하는 것이 좋습니다.

+0

방금 ​​교환의 isRollbackOnly()가 true이면 로깅 수준을 ERROR에서 WARNING으로 다운 그레이드했습니다. activemq 엔드 포인트의 트랜잭션 지원을 사용 가능하게 했습니까? –

+0

@WillemJiang Camel이 기본 로깅 수준을 WARNING으로 다운 그레이드하기로 결정 했더라도 errorHandler가 오류 수준으로 다시 덮어 쓰지 않겠습니까? 어쨌든 재시도 횟수를 모두 사용한 경고 로그조차 얻지 못했습니다. amq 끝점의 트랜잭션 지원을 활성화했는지 확신 할 수 없지만 정말 변경 될 수 있습니까? 나는 errorHandler가 dead letter endpoint가 아닌 고갈을 제어 할 것이라고 생각했을 것이다. 재시도 횟수가 모두 소진되면 실제로 로그를 남깁니 까? 나는 그것이 무엇을 말할지를 아직 보지 못했다. – alexanderific

+0

activemq 엔드 포인트를 direct 또는 seda 엔드 포인트로 변경할 수 있습니까? 거기에서 로그 레벨을 설정할 수 있는지 확인하십시오. –

답변

0

ErrorHandler의 DeadLetterChannel을 직접 끝점으로 업데이트했습니다. 2 개의 logLevel 구성을 동일하게 남겨 둡니다. 3 번의 재시도 시도가 있었지만 재 시도가 완료되었다는 ERROR 로그는 없었습니다. 그러나 나는 기록하는 직접적인 데드 레터 엔드 포인트를 듣는 작은 경로를 설정했는데 그것이 작동하고 있습니다.

ERROR 로그를 고갈시키려는 욕망에 대한 직접적인 해결책은 아니지만 현재로서는 적절한 해결 방법입니다.

관련 문제