1

jcabi-aspects を使用して、接続が戻るまで URL http://xxxxxx:8080/helloへの接続を再試行しています。

jcabi @RetryOnFailure でattempts(12)=expiryTime(1 min=60000 millis)/delay(5 sec=5000 millis)のような操作を実行したいのですが、どうすればいいですか? コード スニペットは以下のとおりです。

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

2 に答える 2

1

2 つの注釈を組み合わせることができます。

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

@RetryOnFailure無限に再試行しますが@Timeable、1 分で停止します。

于 2016-09-25T00:29:12.140 に答える
1

選択したライブラリ ( jcabi) には、この機能がありません。しかし幸いなことに、Spring-Batch から非常に便利な RetryPolicies が抽出されています (したがって、バッチ処理なしで単独で使用できます)。

春のリトライ

そこから使用できる多くのクラスの 1 つが 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、リスナーなどの機能が満載です。

于 2016-09-24T13:11:35.673 に答える