业务场景:
触发执行一个任务,前端 定时|实时 获取任务执行的进度
使用工具:
1.任务需要异步执行,使用异步任务执行器TaskExecutor
2.用Redis实时保存更新进度
代码实现:
1.用移除集合中的元素模拟业务场景,异步执行任务:每次移除一个元素
public class testTask {
TaskExecutor taskExecutor;
RedisService redisService;
public void invokeTask() {
//获取一个集合;集合中有100个元素
List<Integer> intList = getList(100);
//任务唯一标识
String taskUUID = IdUtil.simpleUUID();
//任务未开始执行,设置redis初始值 为 1等同于100%
redisService.hset("move_list_task", taskUUID, "1");
//异步执行移除元素
taskExecutor.execute(() -> this.moveList(intList, taskUUID));
}
public List<Integer> getList(int num) {
List<Integer> intList = Arrays.asList();
while (num > 0) {
intList.add(num);
}
return intList;
}
public void moveList(List<Integer> intList, String taskUUID) {
int total = intList.size();//总计任务长度
double unitRate = (double) (100 / total);//单次执行所占比例
int time = 0; //执行次数初始化=0
while (intList.size() > 0) {
time++;
intList.remove(intList.size() - 1);
//更新redis
redisService.hset("move_list_task", taskUUID, String.valueOf((time * unitRate) / total));
}
}
}
2.查询进度接口,根据业务需要,前端可2秒调用一次
public String getRate(String taskUUID) {
//获取进度-前端调用
String rate = redisService.hget(
"move_list_task",
taskUUID);
return null == rate ? "0" : rate;
}