延时任务机制说明
架构说明
延时任务:指定某日期执行某自定义任务
思路为采用Rabbitmq中的死信转移队列的技术点实现。
第一步向一个队列(具有xxxx属性)发送消息,这个队列的消息可以指定失效时间
当失效发生时rabbbitmq会将此消息转移到另外的一个普通对列中,此时立刻被消费了,以此实现任务的延迟执行。
AMQP 延时任务核心类图
TimeTrigger 触发器接口,对外提供定义延迟任务的接口,调用者直接面向此接口。
目前只实现了基于RabbitMq的实现,如果有其他延时任务实现(如基于redis),面向此接口开发即可,定义新增、编辑、删除任务操作。
RabbitmqTimeTrigger
基于rabbitmq延时任务实现
TimeTriggerConfig,rabbitmq配置
TimeTriggerMsg,rabbitmq延时任务消息
执行器类图
TimeTriggerConsumer 延时任务消费者,负责延时任务的调用
TimeTriggerExecuter 延时任务执行器接口,自定义延时任务需要实现此接口
PintuanTimeTriggerExecuter 以拼团业务为例,延时任务执行的实现。
新增任务时序图
步骤说明:
1、新增延时任务,指定延时任务所需的参数(执行器beanName,执行器参数,执行日期,执行任务标识KEY)
2、rabbitmq发送消息,将执行器以及参数封装
3、写入redis,标识任务需要执行
4、mq监听 指定时间任务
5、消费者获取redis的任务标识
7、进行标识判断,如果判断无效,则不执行任务,return
8、如果任务标识有效,则通过springbean容器获取执行器,执行execute方法
编辑任务流程图
步骤说明:
1、编辑延时任务,指定延时任务所需的参数(执行器,执行器参数,执行日期,执行任务标识KEY)
2、删除redis中的任务标识,代表任务取消
3、rabbitmq发送消息,将执行器以及参数封装
4、写入redis,标识任务需要执行
5、mq监听 指定时间任务
7、消费者获取redis的任务标识
8、进行标识判断,如果判断无效,则不执行任务,return
9、如果任务标识有效,则通过springbean容器获取执行器,执行execute方法
删除任务流程图
步骤说明:
1、删除延时任务,参数(执行任务标识KEY)
2、删除redis中的任务标识,代表任务取消