自动重试的最简写法(java8)
无需引入 框架的最简写法
支持设置重试次数
工具类
import cn.hutool.core.map.MapUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.LinkedCaseInsensitiveMap;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;
/**
* 简单实用的自动重试机制,java8 写法 通用工具类
* required: JDK8, hutool-util ,lombok
*
* @author stormfeng
* @date 2023-06-02 14:23
*
* @see `引入其他框架较复杂的用法,暂时不需要 https://juejin.cn/post/6844903910805602312`
*/
@Slf4j
public class RetryUtils {
/**
* 测试入口
*/
public static void main(String[] args) {
Integer retry = retry(100, () -> 1 / 1);
log.info("retry:{}",retry);
Map<Object, Object> map = new HashMap<>();
RetryUtils.retry(() -> getResponse(new LinkedCaseInsensitiveMap() {{
putAll(map); // 重置 offset 分页等参数 后再次 从头重跑
}}, new ArrayList()));
retry = retry(100, () -> 1 / 0);
log.info("retry:{}",retry);
}
/**
* 通用工具类:默认 20次
*/
public static <T> T retry(int times, Supplier<T> supplier) {
if (times < 0 || times >= 100) {
times = 20;
}
for (int i = 0; i < times; i++) {
try {
return supplier.get();
} catch (Exception e) {
log.warn("{},重试第 {} 次", e.getMessage(), i + 1);
}
}
throw new RuntimeException("重试次数耗尽 "+times);
}
/**
* 通用工具类:默认 20次
*/
public static <T> T retry(Supplier<T> supplier) {
return retry(20, supplier);
}
/**
* 模拟分页查询
*/
private static List getResponse(Map map, List result) {
final Integer limit = MapUtil.getInt(map, "limit", 100), offset = MapUtil.getInt(map, "offset", 0);
result.add(offset);
map.put("offset", offset + limit);
if (MapUtil.getInt(map, "offset") <= 300) {
return getResponse(map, result);
}
//模拟报错
if (offset <= 300) {
int aa = 1 / 0;
}
return result;
}
}
调用示例
// 1 默认次数
Integer retry = retry(() -> 1 / 1);
// 2 指定重试100次
retry = retry(100, () -> 1 / 0);
// 3
Map<Object, Object> map = new HashMap<>();
RetryUtils.retry(() -> getResponse(new LinkedCaseInsensitiveMap() {{
putAll(map); // 重置 offset 分页等参数 后再次 从头重跑
}}, new ArrayList()));
pom.xml jar包参考
<properties>
<lombok.version>1.18.24</lombok.version>
<hutool-all.version>5.8.18</hutool-all.version>
</properties>
<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool-all.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>