RequestHandlerRetryAdvice с HttpRequestExecutingMessageHandler не работает - PullRequest
0 голосов
/ 10 мая 2018

У меня есть файл конфигурации ниже.

@Configuration
@PropertySource({ "application.properties" })
@EnableIntegration
@IntegrationComponentScan
@EnableRetry
public class IntegrationBeanConfiguration {

    @Bean
    public SimpleRetryPolicy retryPolicy(){
        SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
        retryPolicy.setMaxAttempts(5);
        return retryPolicy;
    }

    @Bean
    public FixedBackOffPolicy fixedBackOffPolicy(){
        FixedBackOffPolicy p = new FixedBackOffPolicy();
        p.setBackOffPeriod(1000);
        return p;
    }

    @Bean
    public RequestHandlerRetryAdvice retryAdvice(SimpleRetryPolicy retryPolicy, FixedBackOffPolicy fixedBackOffPolicy){
        RequestHandlerRetryAdvice retryAdvice = new RequestHandlerRetryAdvice();
        RetryTemplate retryTemplate = new RetryTemplate();
        retryTemplate.setBackOffPolicy(fixedBackOffPolicy);
        retryAdvice.setRetryTemplate(retryTemplate);
        return retryAdvice;
    }

    @Bean
    @ServiceActivator(inputChannel="rtpRequestPostOperationRequestChannel")
    public MessageHandler httResponseMessageHandler(MessageChannel rtpRequestPostOperationResponseChannel, HeaderMapper<HttpHeaders> headerMapper, RequestHandlerRetryAdvice retryAdvice) {
        List<Advice> list = new ArrayList<>();
        list.add(retryAdvice);
        HttpRequestExecutingMessageHandler handler = new HttpRequestExecutingMessageHandler("https://myhost:8080/rtp/request");
        handler.setHttpMethod(HttpMethod.POST);
        handler.setHeaderMapper(headerMapper);
        handler.setOutputChannel(rtpRequestPostOperationResponseChannel);
        handler.setExpectedResponseType(RtpResponse.class);
        handler.setAdviceChain(list);
        return handler;
    }

}

В моем понимании повторная попытка сработает, если я сделаю запрос на несуществующий URL-адрес, такой как

https://myhost:8080/rtp/request123

Но повтор не происходит. Пожалуйста, сообщите, если мое понимание неверно или что-то не так в конфигурации.

Спасибо

1 Ответ

0 голосов
/ 14 мая 2018

С помощью комментария Гэри. Следующая конфигурация работает

@Configuration
@PropertySource({ "application.properties" })
@EnableIntegration
@IntegrationComponentScan
@EnableRetry
public class IntegrationBeanConfiguration {

    @Bean
    public SimpleRetryPolicy retryPolicy(){
        SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
        retryPolicy.setMaxAttempts(5);
        return retryPolicy;
    }

    @Bean
    public FixedBackOffPolicy fixedBackOffPolicy(){
        FixedBackOffPolicy p = new FixedBackOffPolicy();
        p.setBackOffPeriod(1000);
        return p;
    }

    @Bean
    public RequestHandlerRetryAdvice retryAdvice(SimpleRetryPolicy retryPolicy, FixedBackOffPolicy fixedBackOffPolicy){
        RequestHandlerRetryAdvice retryAdvice = new RequestHandlerRetryAdvice();
        RetryTemplate retryTemplate = new RetryTemplate();
        retryTemplate.setBackOffPolicy(fixedBackOffPolicy);
        retryTemplate.setRetryPolicy(retryPolicy)
        retryAdvice.setRetryTemplate(retryTemplate);
        return retryAdvice;
    }

    @Bean
    @ServiceActivator(inputChannel="rtpRequestPostOperationRequestChannel")
    public MessageHandler httResponseMessageHandler(MessageChannel rtpRequestPostOperationResponseChannel, HeaderMapper<HttpHeaders> headerMapper, RequestHandlerRetryAdvice retryAdvice) {
        List<Advice> list = new ArrayList<>();
        list.add(retryAdvice);
        HttpRequestExecutingMessageHandler handler = new HttpRequestExecutingMessageHandler("https://myhost:8080/rtp/request");
        handler.setHttpMethod(HttpMethod.POST);
        handler.setHeaderMapper(headerMapper);
        handler.setOutputChannel(rtpRequestPostOperationResponseChannel);
        handler.setExpectedResponseType(RtpResponse.class);
        handler.setAdviceChain(list);
        return handler;
    }

}
...