再試行機構の使い方と実現

8124 ワード

RPC外部呼び出しにおいて、ネットワークが不安定な場合、再試行機能は比較的重要な必須項目である。
解決策は、例えば:
  • 失敗再試行時間に基づいて、遅延行列が作成され、もし要求が失敗したら、キューに入れ、消費し、
  • spring retry,
  • gava retrying、
  • sisyphus
  • 本文は一番簡単な方法でspringboot+spring retryを使います。他の金持ちは自分で見に行きます。
    spring retry実現
  • まず、関連するpom依存性
  • を導入する。
     		<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>
    
  • 起動クラスに@EnbaleRetry
  • を追加します。
  • 関連注釈に基づいて
  • を使用する。
    @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秒となります。