# retry
**Repository Path**: lcwpro/retry
## Basic Information
- **Project Name**: retry
- **Description**: 易用,且强大的重试库,支持异步重试、宕机重启重试,多模式时间间隔(cron、等差、等比)
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 1
- **Created**: 2021-01-08
- **Last Updated**: 2024-07-25
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
#### Retry-重试工具
##### 1. 特性
+ 同步和异步重试、异步重试通过回调方法的方式返回
+ 多间隔模式(等差、等比、cron表达式等)
+ 自定义重试触发条件
+ 宕机重启异步重试
##### 2. 安装
``` xml
com.github.vizaizai
retry
1.1.4
```
##### 3. 使用
###### 同步重试:
无返回值业务处理器为`VProcessor`, 如是业务方法有返回值则使用`Processor`作为`inject()`的入参。
``` java
// 无返回值,没有间隔时间,发生RuntimeException或者Error时触发重试
Retry retry1 = Retry.inject(() -> {
System.out.println("执行业务方法");
if (Utils.getRandom(5,1) > 3) {
throw new RuntimeException("业务出错");
}
});
retry1.execute();
```
###### 异步重试:
调用`async(Callback callback)`并传入回调方法。`T`是业务方法返回值类型。
``` java
Retry asyncRetry = Retry.inject(() -> {
System.out.println("执行业务方法");
if (Utils.getRandom(5,1) > 3) {
throw new RuntimeException("业务出错");
}
return "hello";
});
asyncRetry.async(result -> {
System.out.println("异步重试回调");
});
asyncRetry.execute();
```
###### 最大重试次数和间隔模式:
最大重试次数默认3次,间隔模式默认为`basic`-固定间隔,间隔时间为0s,也就是无间隔,Retry同时还支持: 等差模式`arithmetic`-以等差数列计算Sn的方式、等比模式`geometric`-以等比数列计算Sn的方式 和 Cron模式`cron`-以cron表达式计算下次执行时间。
``` java
Retry.inject(new MyProcessor())
//.mode(Modes.cron("13,37,58 * * * * ?")) //cron模式,不支持年份
//.mode(Modes.basic(1))// 基础模式,间隔一秒
.mode(Modes.arithmetic(1, 0, ChronoUnit.SECONDS)) // 等差模式,首项1,公差0,单位S
//.mode(Modes.geometric(1D, 2D, ChronoUnit.SECONDS)) // 等比模式,首项1,公比2,单位S
.max(10) // 最大重试次数
.async(new MyCallback())
.retryFor(RetryException.class)
.execute();
```
###### 触发条件:
通过`retryFor()`指定发生哪些异常触发重试(包含子类),默认发生RuntimeException或者Error时触发重试。以下代码不会触发重试,因为RetryException也是继承RuntimeException,IllegalArgumentException不是它或它的子类。
``` java
Retry retry1 = Retry.inject(() -> {
if (Utils.getRandom(5,1) > 3) {
throw new IllegalArgumentException("业务出错");
}
});
retry1.(RetryException.class)
.execute();
```
###### 宕机重启异步重试:
对于异步重试模式,当重试未结束,还未执行回调时,服务宕机了,这时可启用宕机重启异步重试。
> **宕机重启异步重试的条件是:`Processor` `VProcessor` 和`Callback`的实现类不能是Lambda表达式或匿名类,因为反序列化时找不到类**
``` java
// 设置对象序列化文件路径,默认值为/data/retry
Reboot.DEFAULT_ASYNC_STORE.setStorePath("/data/retry");
// 服务重启时执行
Reboot.getInstance().start();
```