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

时间:2016-09-24 07:11:52

标签: spring spring-aop jcabi

我使用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();
}

2 个答案:

答案 0 :(得分:1)

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

Spring-Retry

您可以使用的许多类之一是TimeoutRetryPolicy:

RetryTemplate template = 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,听众等。

答案 1 :(得分: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会在一分钟内停止播放。