如何通过 jcabi 对@RetryOnFailure 执行新操作

How to perform new operation on @RetryOnFailure by jcabi

我正在使用 jcabi-aspects 重试连接到我的 URL http://xxxxxx:8080/hello 直到连接成功 back.As 你知道 jcabi 的 @RetryOnFailure 有两个字段尝试和延迟。

我想在jcabi上执行attempts(12)=expiryTime(1 min=60000 millis)/delay(5 sec=5000 millis)这样的操作@RetryOnFailure.How 我要做什么 this.The 代码片段如下。

@RetryOnFailure(attempts = 12, delay = 5)
public String load(URL url) {
  return url.openConnection().getContent();
}

您选择的库 (jcabi) 没有此功能。但幸运的是,来自 Spring-Batch 的非常方便的 RetryPolicies 已被提取(因此您可以单独使用它们,而无需批处理):

Spring-Retry

您可以从那里使用的众多 类 之一是 TimeoutRetryPolicy:

RetryTemplate 模板 = new RetryTemplate();

TimeoutRetryPolicy policy = new TimeoutRetryPolicy();
policy.setTimeout(30000L);

template.setRetryPolicy(policy);

Foo result = template.execute(new RetryCallback<Foo>() {

    public Foo doWithRetry(RetryContext context) {
        // Do stuff that might fail, e.g. webservice operation
        return result;
    }

});

整个 spring-retry 项目非常易于使用且功能齐全,如 backOffPolicies、监听器等

您可以组合两个注释:

@Timeable(unit = TimeUnit.MINUTE, limit = 1)
@RetryOnFailure(attempts = Integer.MAX_VALUE, delay = 5)
public String load(URL url) {
  return url.openConnection().getContent();
}

@RetryOnFailure will retry forever, but @Timeable 马上停止