1、需求

  • 任务可随时手动终止。
  • 任务发生异常后,任务终止,再次启动任务能断点续处理。
  • 断点续处理:重新启动任务后,业务从上次中断的数据之后开始处理。

2、XXLJob官方文档终止任务方法

img

3、方案

因为解决方案比较通用,所以将代码写到公共工程chery中,以便复用。

使用JobHandler的init和destroy处理任务数据:init = “JobHandler初始化方法”, destroy = “JobHandler销毁方法”

执行流程:

  • 任务启动后,根据类型及状态查询xxlJob任务表
  • 如果存在未完成的任务,获取结束id,任务开始
  • 处理任务
  • 如果发生异常(业务异常、手动终止后的中断异常),更新xxlJob任务表,任务未完成
  • 如果任务正常结束,更新xxlJob任务表,任务已完成

4、XXLJob任务表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE `job_task` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
`state` tinyint(4) NOT NULL DEFAULT '0' COMMENT '处理状态 0 未完成, 1 已完成',
`start_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '开始id',
`end_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '结束id',
`type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '类型',
`creationtime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`creator` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '创建人',
`modifiedtime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`modifier` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '修改人',
`is_deleted` tinyint(2) NOT NULL DEFAULT '0' COMMENT '逻辑删除标识,0 未删除,1 已删除',
PRIMARY KEY (`id`),
KEY `idx_type_state` (`type`,`state`) USING BTREE COMMENT 'type、state联合索引'
) COMMENT='XXLJob任务表';