背景
目前的延时任务组件赋予了我们系统异步任务执行器或者延迟任务执行器的功能,但是对于一些业务场景,异步触发的某种类型的任务,这个异步任务本身需要根据某些限定条件单线程排队执行
比如:调用A接口后,调用异步执行B方法,B方法会维护A的相关业务的统计,耗时较久。如果触发多次A接口,这些异步任务B可能会产生后触发的被先触发的覆盖掉,即并发中的ABA问题。这个时候就需要有一个排队任务的机制,根据某些业务id和业务类型进行任务排队,在排队队列中逐个执行。
方案设计
1、表设计:
通过新增排队任务表来承载和记录排队任务
1 2 3 4 5 6 7 8 9 10 11 12
| CREATE TABLE `sup_queue_task` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '任务id', `queue_biz_type` int NOT NULL DEFAULT '1' COMMENT '排队任务类型', `task_param` text COMMENT '任务参数', `task_keyword` varchar(128) NOT NULL DEFAULT '' COMMENT '关键字', `task_state` int NOT NULL DEFAULT '1' COMMENT '任务状态 1 待执行 2 执行中 3 执行成功 4 执行失败', PRIMARY KEY (`id`) USING BTREE, KEY `idx_sup_queue_task_2` (`queue_biz_type`) USING BTREE, KEY `idx_sup_queue_task_3` (`task_keyword`) USING BTREE, KEY `idx_sup_queue_task_4` (`queue_biz_type`, `task_keyword`, `task_state`) ) ENGINE = InnoDB COMMENT ='排队任务管理表';
|
2、执行流程
排队任务状态流转图

1、任务生成

2、任务排队(定时任务定时轮询)

3、任务状态更新(定时任务定时轮询)

3、使用示例
1、定义异步任务枚举实例,编写异步任务逻辑
2、定义排队任务枚举,关联异步任务枚举实例
3、业务代码直接发布排队任务事件
4、排队任务排队执行