异步任务机制
前言&使用场景描述
交付工作台中部分大事务、逻辑复杂的场景执行耗时长,就会出现请求超时的情况。
我们可以使用异步任务的形式,减少用户等待或者请求超时,提升交互体验
使用说明
需要在环境变量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@RequiredArgsConstructorpublic 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; } }- 超时时间:默认30分钟;注意:需要保证任务的执行时间小于超时时间,否则可能会出现任务还在执行中任务状态被切换成失败超时,最后当任务执行完成后状态又重新更新成已完成
- 异步任务机制是利用AOP实现,需要保证方法的调用能够被spring代理
- 任务执行结果将会通过消息发送至客户端,任务返回值对象会以json文本的格式存储入库点
- 任务执行的进度,需要注入
io.terminus.trantor.async.task.AsyncTaskService,调用incrProgress方法增加进度 - 任务名称支持spEL表达式
- 执行过程中可通过
asyncTaskService.addTaskSubData(obj)方法存储一些执行过程需要保存的任务信息
注意事项
异步机制默认采用线程池
-
考虑一期接入场景并发量较低,使用丢弃策略 线程池达到最大线程数后续任务将会抛出业务异常:
@Message(code = "AT_110", value = "Task add queue failure")String TASK_ADD_QUEUE_FAILURE = "task.add.queue.failure";
消息
- 消息不支持持久化
- 消息断连重试机制默认10次,需要手动刷新重建连接
- 现有UC和mock用户模式,mock模式下所用用户都将收到消息
效果
首页任务图标及执行中的任务

任务中心
