Java lambda函数中的Spring重试不';好像不行

Java lambda函数中的Spring重试不';好像不行,java,spring-boot,spring-retry,Java,Spring Boot,Spring Retry,我有一个用Spring Boot构建的lambda函数,它对一个每秒可以接受10个请求的服务进行REST调用。在那10次请求之后,我得到了403 事实证明,试图找到一种在这种约束条件下工作的方法是困难的 目前,我的代码看起来像 @Slf4j @UtilityClass public class HttpUtil { private final RestTemplate restTemplate = new RestTemplate(); @Retryable(maxAttem

我有一个用Spring Boot构建的lambda函数,它对一个每秒可以接受10个请求的服务进行REST调用。在那10次请求之后,我得到了403

事实证明,试图找到一种在这种约束条件下工作的方法是困难的

目前,我的代码看起来像

@Slf4j
@UtilityClass
public class HttpUtil {

    private final RestTemplate restTemplate = new RestTemplate();

    @Retryable(maxAttempts = 60, backoff = @Backoff(delay = 10000, multiplier = 2))
    public ResponseEntity<String> sendPostRequest(@NonNull final MultiValueMap<String, Object> data, @NonNull final String url) {
        final HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(data, new HttpHeaders());

        return restTemplate.postForEntity(url, request, String.class);
    }
}
一个非常简单的听众

@Slf4j
public class DefaultListenerSupport extends RetryListenerSupport {

    @Override
    public <T, E extends Throwable> void close(final RetryContext context,
                                               final RetryCallback<T, E> callback, final Throwable throwable) {

        log.info("onClose {}", throwable.getMessage());

        super.close(context, callback, throwable);
    }

    @Override
    public <T, E extends Throwable> void onError(final RetryContext context,
                                                 final RetryCallback<T, E> callback, final Throwable throwable) {

        log.info("onError {}", throwable.getMessage());

        super.onError(context, callback, throwable);
    }

    @Override
    public <T, E extends Throwable> boolean open(final RetryContext context,
                                                 final RetryCallback<T, E> callback) {

        log.info("onOpen");

        return super.open(context, callback);
    }
}
@Slf4j
公共类DefaultListenerSupport扩展了RetryListenerSupport{
@凌驾
公共无效关闭(最终RetryContext上下文,
最终RetryCallback回调,最终可丢弃可丢弃){
log.info(“onClose{}”,throwable.getMessage());
super.close(上下文、回调、可丢弃);
}
@凌驾
公共无效onError(最终RetryContext上下文,
最终RetryCallback回调,最终可丢弃可丢弃){
log.info(“onError{}”,throwable.getMessage());
super.onError(上下文、回调、可丢弃);
}
@凌驾
公共布尔打开(最终RetryContext上下文,
最终RetryCallback(回调){
日志信息(“onOpen”);
返回super.open(上下文,回调);
}
}

干杯

使用
@Retryable
注释的类需要是SpringBean,否则您需要直接使用
RetryTemplate
而不是注释

如果不希望类成为bean,可以执行以下操作:

private static final RetryTemplate retryTemplate = new RetryTemplate();
    static {
         SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
         retryPolicy.setMaxAttempts(60);
         ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy();
         backOffPolicy.setMultiplier(2);
         backOffPolicy.setInitialInterval(10000);
         retryTemplate.setRetryPolicy(retryPolicy);
         retryTemplate.setBackOffPolicy(backOffPolicy);
    }
    private void doSomething() {
        retryTemplate.execute(retryContext -> {
            return restTemplate.postForEntity(url, request, String.class);
        });
    }

使用
@Retryable
注释的类必须是Springbean,否则您将需要直接使用
RetryTemplate
而不是注释

如果不希望类成为bean,可以执行以下操作:

private static final RetryTemplate retryTemplate = new RetryTemplate();
    static {
         SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
         retryPolicy.setMaxAttempts(60);
         ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy();
         backOffPolicy.setMultiplier(2);
         backOffPolicy.setInitialInterval(10000);
         retryTemplate.setRetryPolicy(retryPolicy);
         retryTemplate.setBackOffPolicy(backOffPolicy);
    }
    private void doSomething() {
        retryTemplate.execute(retryContext -> {
            return restTemplate.postForEntity(url, request, String.class);
        });
    }

您在配置类上有
@enablerery
吗?是的,很抱歉,
@Bean
配置为附加侦听器的位置相同。而您的
@UtilityClass
注释是一个元注释,它包含一个spring注释,如
@Component
等,我假设?
>已忽略
=您不能仅仅添加'RetryTemplate`
@Bean
,然后期望它被使用。要使用自定义
RetryTemplate
,您必须构建一个拦截器并在注释中使用它。您实际上不需要侦听器,只需启用调试日志即可查看重试活动。如果您没有看到,那么@aarbor可能是对的,您没有使用重试侦听器通过代理调用它。您在配置类上有
@enablerery
吗?是的,我很抱歉,与
@Bean
配置为附加侦听器的位置相同。您的
@utilityplass
注释是一个元注释,它包含一个spring注释,如
@Component
等,我假设?
>已忽略
=您不能只添加'RetryTemplate`
@Bean
,并期望使用它。要使用自定义
RetryTemplate
,您必须构建一个拦截器并在注释中使用它。您实际上不需要侦听器,只需启用调试日志即可查看重试活动。如果您没有看到,那么@aarbor可能是对的,您没有使用重试拦截器通过代理调用它。这是正确的,我只是在重构时错过了
@组件。谢谢你的点评。这是正确的,我只是在重构时错过了
@Component
。谢谢你的到场。