방법 봄 - 통합의 전체 폴러 흐름을 다시 시도합니다

user2038596 :

나는 스프링 통합 폴러 흐름에 대한 재시도 패턴 (전체 흐름을 다시 시도)를 구현하는 방법에 대한 내 머리카락을 잡아 당겨 왔습니다. 내 (잘못된) 소스 코드를 검색 (작동하지 않습니다).

내가 도대체 ​​뭘 잘못하고있는 겁니까 ?
(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().

추천

출처http://43.154.161.224:23101/article/api/json?id=339524&siteId=1