1

我正在使用 jcabi-aspects 重试连接到我的 URL http://xxxxxx:8080/hello直到连接恢复。如您所知,jcabi 的 @RetryOnFailure 有两个字段尝试和延迟。

我想在jcabi @RetryOnFailure 上执行尝试(12)=过期时间(1 分钟=60000 毫秒)/延迟(5 秒=5000 毫秒)之类的操作。我该怎么做。代码片段如下。

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

2 回答 2

1

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

春季重试

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

RetryTemplate 模板 = 新的 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、listeners 等。

于 2016-09-24T13:11:35.673 回答
1

您可以组合两个注释:

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

@RetryOnFailure将永远重试,但@Timeable会在一分钟内停止。

于 2016-09-25T00:29:12.140 回答