나는 스프링 통합 폴러 흐름에 대한 재시도 패턴 (전체 흐름을 다시 시도)를 구현하는 방법에 대한 내 머리카락을 잡아 당겨 왔습니다. 내 (잘못된) 소스 코드를 검색 (작동하지 않습니다).
내가 도대체 뭘 잘못하고있는 겁니까 ?
(I 예외를 던지는 줄에 중단 점을 넣을 경우, 한 번 공격에만 있어요)
덕분에 당신의 시간과 전문 지식을 사전에 많은.
친애하는
nkjp
PS : 어쩌면 RetryTemplate와 AbstractHandleMessageAdvice을 확장하려고?
return IntegrationFLows.from(SOME_QUEUE_CHANNEL)
.transform(p -> p, e -> e.poller(Pollers.fixedDelay(5000)
.advice(RetryInterceptorBuilder.stateless().maxAttempts(5).backOffOptions(1,2,10).build())))
.transform(p -> {
if (true) {
throw new RuntimeException("KABOOM");
}
return p;
})
.channel(new NullChannel())
.get();
당신이 추가하면 poller.advice()
, 다음은 Advice
로 시작하는 전체 흐름에 적용되는 poll()
방법. 당신이 이미 큐에서 메시지를 폴링 한 이후, 다음 시도에서 그것에서 설문 조사에 아무것도 없다. 그것은 비 트랜잭션 큐에 대한 사용 재시도에 안티 패턴 좀 있습니다 : 가게에 돌아 오지 않는 데이터가 다음에 사용할 수 있도록하지 롤백 트랜잭션을 수행합니다 poll()
.
이 어떤 점에서 전체 하위 흐름을 다시 시도하는 순간에 방법이 없다,하지만 당신은 확실히 사용할 수 RequestHandlerRetryAdvice
같은 것을 특정 잘못된 엔드 포인트에 transform()
와 KABOOM
예외 :
.transform(p -> {
if (true) {
throw new RuntimeException("KABOOM");
}
return p;
}, e -> e.advice(new RequestHandlerRetryAdvice()))
자신을 참조 setRetryTemplate(RetryTemplate retryTemplate)
하는 대신 기본적으로 단 3 회 이상 재시도 옵션.
하위 흐름하려면, 우리는을 구현하기 위해 고려해야합니다 HandleMessageAdvice
. 이 같은:
.transform(p -> p, e -> e.poller(Pollers.fixedDelay(500000))
.advice(new HandleMessageAdvice() {
RetryOperationsInterceptor delegate =
RetryInterceptorBuilder.stateless()
.maxAttempts(5)
.backOffOptions(1, 2, 10)
.build();
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
return delegate.invoke(invocation);
}
}))
그러나 다시 : 그것은 아닌입니다 poller
. 조언, 그것의에 엔드 포인트의 하나입니다 MessageHandler.handleMessage()
.