美文网首页
【转】使用Guava retryer优雅的实现接口重调机制

【转】使用Guava retryer优雅的实现接口重调机制

作者: 小孩真笨 | 来源:发表于2019-06-11 11:45 被阅读0次

Guava retryer工具与spring-retry类似,都是通过定义重试者角色来包装正常逻辑重试,但是Guava retryer有更优的策略定义,在支持重试次数和重试频度控制基础上,能够兼容支持多个异常或者自定义实体对象的重试源定义,让重试功能有更多的灵活性。Guava Retryer也是线程安全的,入口调用逻辑采用的是Java.util.concurrent.Callable的call方法。
使用Guava retryer 很简单,我们只要做以下几步:

Maven POM 引入

<guava-retry.version>2.0.0</guava-retry.version>
<dependency>
      <groupId>com.github.rholder</groupId>
      <artifactId>guava-retrying</artifactId>
      <version>${guava-retry.version}</version>
</dependency>

定义实现Callable接口的方法,以便Guava retryer能够调用

private static Callable<Boolean> updateReimAgentsCall = new Callable<Boolean>() {
   @Override
   public Boolean call() throws Exception {
       String url = ConfigureUtil.get(OaConstants.OA_REIM_AGENT);
       String result = HttpMethod.post(url, new ArrayList<BasicNameValuePair>());
       if(StringUtils.isEmpty(result)){
          throw new RemoteException("获取OA可报销代理人接口异常");
       }
       List<OAReimAgents> oaReimAgents = JSON.parseArray(result, OAReimAgents.class);
       if(CollectionUtils.isNotEmpty(oaReimAgents)){
           CacheUtil.put(Constants.REIM_AGENT_KEY,oaReimAgents);
           return true;
       }
       return false;
   }
};

定义Retry对象并设置相关策略

Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
                //抛出runtime异常、checked异常时都会重试,但是抛出error不会重试。
                .retryIfException()
                //返回false也需要重试
                .retryIfResult(Predicates.equalTo(false))
                //重调策略
                .withWaitStrategy(WaitStrategies.fixedWait(10, TimeUnit.SECONDS))
                //尝试次数
                .withStopStrategy(StopStrategies.stopAfterAttempt(3))
                .build();
 
try {
    retryer.call(updateReimAgentsCall());
    # 以下方式可以不用实现第二步中所说的实现Callable接口定义方法
    //retry.call(() -> { FileUtils.downloadAttachment(projectNo, url, saveDir, fileName);  return true; });
} catch (ExecutionException e) {
    e.printStackTrace();
} catch (RetryException e) {
    logger.error("xxx");
}

简单三步就能使用Guava Retryer优雅的实现重调方法。

作者:蒋老湿
链接:https://juejin.im/post/5cdb81156fb9a03202223d15
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章

网友评论

      本文标题:【转】使用Guava retryer优雅的实现接口重调机制

      本文链接:https://www.haomeiwen.com/subject/swiffctx.html