同步操作将从 spjich/retrieval 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
项目中有很多需要重试的场景,而每次都得写如下的逻辑
for (int i=0;i++;i<retry){
try{
do(//逻辑代码);
if(success){
break;
}
}catch(Exception e){
}
}
这么做会有如下几个问题
本组件希望提供一个统一的方案来解决这个简单但给我们代码带来不便的问题。
最简单用法
new RetryBuilder().build().proceed((round, nanos) -> "success");
外加参数控制
new RetryBuilder().retry(10).delay(1000).timeout(5000).pool(Executors.newSingleThreadExecutor()).build().async((round, nanos) -> "success");
回调形式
new RetryBuilder().build().proceed(
new Retryable<Integer>() {
@Override
public Integer proceed(int round, long nanos) {
logger.info("success");
return 1;
}
@Override
public Integer whenFinish(Integer ret, int round, long nanos) {
logger.info("finish");
return 999;
}
@Override
public boolean postCondition(Integer ret, int round, long nanos) {
logger.info(round + "");
return true;
}
@Override
public boolean preCondition(int round, long nanos) {
return true;
}
}));
无回调形式
Class[] failOn = {IllegalAccessException.class};
Class[] continueOn = {IllegalArgumentException.class};
new RetryBuilder()
.withCondition()
.failOn(failOn)
.continueOn(continueOn)
.build()
.proceed(() -> "success");
注意:
new RetryBuilder().build()
出来的RetryLoop
非线程安全
设置
retry
即重试次数(默认:1)
delay
每次重试间隔 (默认:0)
timeout
执行超时时间(proceed模式不支持) (默认:FOREVER)
pool
自定义线程池 (默认:全局唯一的CachedThreadPool)
timeoutPolice
超时时所采取的停止策略。SetFlag:只设置标识位,重试线程必须跑完一次循环才会跳出。InterruptAndSetFlag:触发中断并设置标识位。(默认:InterruptAndSetFlag)
回调(callback形式下生效)
whenError
重试体抛异常时回调,并返回是否需要跳出循环
whenFinish
整个重试逻辑正常执行完毕时回调
postCondition
循环后置条件,每次重试完成时回调
preCondition
循环前置条件,每次执行前回调
whenTimeout
重试超时时回调,此时不会再回调whenFinish
###关于异常
whenError
中的异常将被忽略,postCondition
,preCondition
,以及proceed
方法中的异常将被保证成ProceedException
抛出。whenFinish
中的异常将直接抛出
条件(condition形式下生效)
withCondition
进入condition形式
failOn
循环失败条件
continueOn
循环继续条件
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。