跳转到内容

异步任务机制

前言&使用场景描述

交付工作台中部分大事务、逻辑复杂的场景执行耗时长,就会出现请求超时的情况。

我们可以使用异步任务的形式,减少用户等待或者请求超时,提升交互体验

使用说明

需要在环境变量MS_MODULES中追加async_task,如下: MS_MODULES:meta_store,event_store,meta_store_management,tenant,sope_dashboard,async_task

pom中加入引用

<dependency>
<groupId>io.terminus.trantor</groupId>
<artifactId>async-task</artifactId>
</dependency>

application.yml

在embedModules和enabledModuleKeys增加async_task;

如下:

trantor:
mainModule: meta_store
embedModules:
- async_task
enabledModuleKeys: async_task

接入方法

需要在任务具体执行入口方法增加注解io.terminus.trantor.async.task.AsyncTask

示例:

@Service
@RequiredArgsConstructor
public class TestService {
private final AsyncTaskService asyncTaskService;
@AsyncTask(name = "测试任务#{#name}", type = AsyncTaskType.META_IMPORT, expire = 5, unit = TimeUnit.MINUTES)
public long task(String name) throws InterruptedException {
for (int i = 0; i < 9; i++) {
Thread.sleep(5000);
// 增加子步骤说明
asyncTaskService.addTaskSubData("步骤执行说明")
// 增加进度 10.0%
asyncTaskService.incrProgress(10);
}
return 0;
}
}
  1. 超时时间:默认30分钟;注意:需要保证任务的执行时间小于超时时间,否则可能会出现任务还在执行中任务状态被切换成失败超时,最后当任务执行完成后状态又重新更新成已完成
  2. 异步任务机制是利用AOP实现,需要保证方法的调用能够被spring代理
  3. 任务执行结果将会通过消息发送至客户端,任务返回值对象会以json文本的格式存储入库点
  4. 任务执行的进度,需要注入io.terminus.trantor.async.task.AsyncTaskService,调用incrProgress方法增加进度
  5. 任务名称支持spEL表达式
  6. 执行过程中可通过asyncTaskService.addTaskSubData(obj) 方法存储一些执行过程需要保存的任务信息

注意事项

异步机制默认采用线程池

  1. 考虑一期接入场景并发量较低,使用丢弃策略 线程池达到最大线程数后续任务将会抛出业务异常:

    @Message(code = "AT_110", value = "Task add queue failure")
    String TASK_ADD_QUEUE_FAILURE = "task.add.queue.failure";

消息

  1. 消息不支持持久化
  2. 消息断连重试机制默认10次,需要手动刷新重建连接
  3. 现有UC和mock用户模式,mock模式下所用用户都将收到消息

效果

首页任务图标及执行中的任务

image-20220513144258816

任务中心

image-20220513145254106