再試行機構の使い方と実現
8124 ワード
RPC外部呼び出しにおいて、ネットワークが不安定な場合、再試行機能は比較的重要な必須項目である。
解決策は、例えば:失敗再試行時間に基づいて、遅延行列が作成され、もし要求が失敗したら、キューに入れ、消費し、 spring retry, gava retrying、 sisyphus 本文は一番簡単な方法でspringboot+spring retryを使います。他の金持ちは自分で見に行きます。
spring retry実現まず、関連するpom依存性 を導入する。起動クラスに@EnbaleRetry を追加します。関連注釈に基づいて を使用する。テスト
value:指定された異常を投げたらincludeをやり直します。valueと同じようにデフォルトは空です。excludeも空です。デフォルトでは異常exclude:未処理の異常maxAttemptsを指定します。最大再試行回数、デフォルトでは3回backoff:再試行策略、デフォルトでは@Backoffを使います。@Backoffのvalueはデフォルトで1000 Lに設定します。multilier(指定遅延倍数)はデフォルトでは0で、固定停止1秒後に再試行することを示しています。multilierを1に設定すると、初めて1秒、2回目は2秒、3回目は3秒となります。
解決策は、例えば:
spring retry実現
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
<version>1.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
@Service
public class LocalWfExampleService {
@Autowired
private WorkflowExampleService workflowExampleServiceRpc;
@Autowired
private WorkflowTask workflowTask;
@Retryable(value= {RemoteAccessException.class},maxAttempts = 3,backoff = @Backoff(delay = 1000l,multiplier = 1))
public void doWfExample(WorkflowExampleDto workflowExampleDto) throws Exception {
List<WorkFlowExample> list= workflowExampleServiceRpc.getWfExample(workflowExampleDto);
if(CollectionUtils.isBlank(list)){
throw new RemoteAccessException("RPC ");
}
workflowTask.createFlow(list);
}
@Recover
public void recover(RemoteAccessException e) {
log.err(e.getMessage());
}
}
@Test
public void test() throw Exception{
localWfExampleService.doWfExample(new WorkflowExampleDto(1,2,3));
}
パラメータの説明value:指定された異常を投げたらincludeをやり直します。valueと同じようにデフォルトは空です。excludeも空です。デフォルトでは異常exclude:未処理の異常maxAttemptsを指定します。最大再試行回数、デフォルトでは3回backoff:再試行策略、デフォルトでは@Backoffを使います。@Backoffのvalueはデフォルトで1000 Lに設定します。multilier(指定遅延倍数)はデフォルトでは0で、固定停止1秒後に再試行することを示しています。multilierを1に設定すると、初めて1秒、2回目は2秒、3回目は3秒となります。