java8 function 实现 retry
2019-07-20 本文已影响35人
良人与我
通过java8 的 function 实现 retry
可以通过参数配置 retry的次数、时间间隙、和所有尝试都失败后的抛出异常。
package com.river.reytry;
import java.util.function.Supplier;
/**
* @author riverfan
* @date 2019-07-19
*/
public class RetryHelp {
private int num = 1;
private Supplier<Boolean> consumer;
private long intervalTime = 0;
private Supplier<RuntimeException> exceptionSupplier;
public static RetryHelp build() {
return new RetryHelp();
}
public RetryHelp tryWith(Supplier<Boolean> t) {
this.consumer = t;
return this;
}
public RetryHelp tryInterval(long time) {
intervalTime = time;
return this;
}
public RetryHelp tryNum(int num) {
this.num = num;
return this;
}
public RetryHelp elseThrow(Supplier<RuntimeException> exceptionSupplier) {
this.exceptionSupplier = exceptionSupplier;
return this;
}
public void start() throws RuntimeException {
for (int i = 0; i < num; i++) {
if (consumer.get()) {
return;
}
//最后一次不用sleep
if(i == num-1){
continue;
}
try {
Thread.sleep(intervalTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("no success throw exception");
if(exceptionSupplier == null){
return;
}
throw exceptionSupplier.get();
}
}
是否需要 retry 是通过 tryWith 的表达式所返回的结果决定。
如果是true 就不用再尝试
如果是false 就继续尝试
直到 尝试的次数num 已经超过,抛出异常
测试
package com.river.reytry;
public class RetryHelpTest {
public static void main(String[] args) {
RetryHelp.build()
.tryWith(() -> {
System.out.println("hello world");
return false;
})
.tryInterval(1000L)
.tryNum(3)
.elseThrow(() -> new RuntimeException("some thing wrong"))
.start();
}
}
结果如下
hello world
hello world
hello world
Exception in thread "main" java.lang.RuntimeException: some thing wrong
at com.river.reytry.RetryHelpTest.lambda$main$1(RetryHelpTest.java:11)
at com.river.reytry.RetryHelp.start(RetryHelp.java:46)
at com.river.reytry.RetryHelpTest.main(RetryHelpTest.java:12)
no success throw exception
Process finished with exit code 1
写个100次的循环,看随机出现3次都是false 的情况会不会
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
System.out.println("--------------");
RetryHelp.build()
.tryWith(() -> {
System.out.println("hello world");
return RandomUtils.nextBoolean();
})
.tryInterval(1L)
.tryNum(3)
.elseThrow(() -> new RuntimeException("some thing wrong"))
.start();
}
}
结果如下
--------------
hello world
hello world
--------------
hello world
--------------
hello world
--------------
hello world
--------------
hello world
hello world
--------------
hello world
hello world
hello world
no success throw exception
Exception in thread "main" java.lang.RuntimeException: some thing wrong
at com.river.reytry.RetryHelpTest.lambda$main$1(RetryHelpTest.java:17)
at com.river.reytry.RetryHelp.start(RetryHelp.java:59)
at com.river.reytry.RetryHelpTest.main(RetryHelpTest.java:18)
Process finished with exit code 1
ok , 如果觉得还不错,请点赞哦。
java8 function 实现 retry