Java lambda函数中的Spring重试不';好像不行
我有一个用Spring Boot构建的lambda函数,它对一个每秒可以接受10个请求的服务进行REST调用。在那10次请求之后,我得到了403 事实证明,试图找到一种在这种约束条件下工作的方法是困难的 目前,我的代码看起来像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
@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
。谢谢你的到场。