跳到主要内容

延时任务机制说明

架构说明

延时任务:指定某日期执行某自定义任务

思路为采用Rabbitmq中的死信转移队列的技术点实现。

第一步向一个队列(具有xxxx属性)发送消息,这个队列的消息可以指定失效时间

当失效发生时rabbbitmq会将此消息转移到另外的一个普通对列中,此时立刻被消费了,以此实现任务的延迟执行。

AMQP 延时任务核心类图

11

TimeTrigger 触发器接口,对外提供定义延迟任务的接口,调用者直接面向此接口。

目前只实现了基于RabbitMq的实现,如果有其他延时任务实现(如基于redis),面向此接口开发即可,定义新增、编辑、删除任务操作。

RabbitmqTimeTrigger

基于rabbitmq延时任务实现

TimeTriggerConfig,rabbitmq配置

TimeTriggerMsg,rabbitmq延时任务消息

执行器类图

11

TimeTriggerConsumer 延时任务消费者,负责延时任务的调用

TimeTriggerExecuter 延时任务执行器接口,自定义延时任务需要实现此接口

PintuanTimeTriggerExecuter 以拼团业务为例,延时任务执行的实现。

新增任务时序图

11

步骤说明:

1、新增延时任务,指定延时任务所需的参数(执行器beanName,执行器参数,执行日期,执行任务标识KEY)

2、rabbitmq发送消息,将执行器以及参数封装

3、写入redis,标识任务需要执行

4、mq监听 指定时间任务

5、消费者获取redis的任务标识

7、进行标识判断,如果判断无效,则不执行任务,return

8、如果任务标识有效,则通过springbean容器获取执行器,执行execute方法

编辑任务流程图

11

步骤说明:

1、编辑延时任务,指定延时任务所需的参数(执行器,执行器参数,执行日期,执行任务标识KEY)

2、删除redis中的任务标识,代表任务取消

3、rabbitmq发送消息,将执行器以及参数封装

4、写入redis,标识任务需要执行

5、mq监听 指定时间任务

7、消费者获取redis的任务标识

8、进行标识判断,如果判断无效,则不执行任务,return

9、如果任务标识有效,则通过springbean容器获取执行器,执行execute方法

删除任务流程图

11

步骤说明:

1、删除延时任务,参数(执行任务标识KEY)

2、删除redis中的任务标识,代表任务取消