有没有一种方法可以在Spring RestTemplate中使用指数退避?
日安!
我想,通过实现自定义睡眠器类可以实现所需的行为。
接下来,您需要将此睡眠器设置为BackOffPolicy,如下所示:
public class RetryTest {
public static final Logger LOG = LoggerFactory.getLogger(RetryTemplate.class);
@org.junit.Test
public void testRT() {
RetryTemplate retryTemplate = new RetryTemplate();
final SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
retryPolicy.setMaxAttempts(5);
retryTemplate.setRetryPolicy(retryPolicy);
Sleeper sleeper = new Sleeper() {
private long timeToSleep = 0;
@Override
public void sleep(long timeout) throws InterruptedException {
if (timeToSleep ==0) {
timeToSleep = timeout;
} else {
timeToSleep = (long) (timeToSleep * Math.E);
}
LOG.warn("sleeping for: {}", timeToSleep);
Thread.sleep(timeToSleep);
}
};
FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy().withSleeper(sleeper);
retryTemplate.setBackOffPolicy(backOffPolicy);
retryTemplate.execute(new RetryCallback<Void, ResourceAccessException>() {
@Override
public Void doWithRetry(RetryContext retryContext) throws ResourceAccessException {
LOG.debug(">RetryCount: {}", retryContext.getRetryCount());
new RestTemplate().getForObject("https://unreachable.host", String.class);
return null;
}
});
}
}
当对骆驼使用Kafka组件时,从Kafka消费时有两种方法可以重试: null org.apache.kafka.clients.Consumer.internals.AbstractCoordinator[Consumer ClientID=Consumer-1,GroupID=2862121D-DDC9-4111-A96A-41BA376C0143]此成员将离开组,因为使用者轮询超时已过期。这
我正在处理一项任务,该任务要求在读取请求消息通道(Queuechannel)中的消息后向外部soap服务客户端发送请求,该通道的原始源是。 消息通道使用消息驱动适配器从获取数据。 消息通道由轮询(通过)将这些消息发送到服务激活器。 (soap client)依次连接到soap服务,并在根据消息中的标头值生成一些逻辑后返回响应。 外部soap服务供应商要求我们以指数方式重试或重发此消息。例如1s,1
问题内容: 对于这样的任务: 如果它引发异常,而我想从守护程序端重试,如何应用指数回退算法,例如,等数秒后? 还可以从服务器端维护重试,以便如果工作进程被杀死,那么产生的下一个工作进程将执行重试任务? 问题答案: 该属性包含到目前为止的尝试次数,因此您可以使用它来实现指数补偿: 为防止雷电群问题,您可以考虑在指数补偿中添加随机抖动:
在RetryTemplate里面,执行excuter方法是重试还是失败是由RetryPolicy决定的,这也是一个RetryContext工厂.这个RetryTemplate有责任使用当前的策略创建一个RetryContext并且把它注入到RetryCallback在每一次尝试中。回调失败后RetryTemplate必须由RetryPolicy决定使其更新状态(存储在RetryContext中),
下面是execute()方法所做的事情
当响应为5xx时,我想在等待10秒后重试请求3次。但我看不到一个我能用的方法。在对象上 吾见方法: 在有重试计数但无延迟的条件下重试 有退避和次数但没有条件的重试 还有一个,但我不确定如何使用它