java任务调度Quartz任务调度框架学习和使用一步步写出基于zk的分布式任务调度组件

基于ThreadPoolTaskScheduler 的轻量级任务

2020-03-27  本文已影响0人  桌面小鱼

一、传统任务调度

基于Scheduled注解的任务调度 将cron表达式写在任务执行的方法上,具体如下:
@Scheduled(cron = "30 59 * * * ?") 定义一个按时间执行的定时任务,在每小时59:30执行一次。
@Scheduled(fixedRate = 1000 * 60) 定义一个按一定频率执行的定时任务,每隔1分钟执行一次
@Scheduled(fixedRate = 1000 * 60,initialDelay = 1000) 定义一个按一定频率执行的定时任务,每隔1分钟执行一次,延迟1秒执行

执行原理:
https://blog.csdn.net/lwjdear/article/details/77991229

二、需求: 需要动态维护任务(维护页面)

架构思路

执行页面


操作页面

实现思路:

1、初始化任务:数据库维护一份任务列表,维护内容包括:任务bean、 任务methed、任务cron、任务模块类型。每种服务器初始化时,只需将自己模块的任务加入到任务队列中即可,按计划执行。
2、前后端交互: 用户在页面CRUD、开关任务等操作,在修改数据库相关内容后,将操作内容发送到MQ中,各服务器订阅自己服务模块类型相关的MQ消息即可,这里的MQ分发消息的方式是广播(即 所有服务器都可拿到任务修改的消息,并针对消息内容对任务队列做出对应CRUD)。
3、任务开始执行:由于是在分布式环境下执行,而且需要保证一个任务只执行一次,为避免重复执行,这里加了zk竞锁的操作,并且不释放(意味着只要在一台服务器上执行了以后,那么后面的任务执行全部都在同一台机器上,其他机器只能等待竞锁,可以保证在某执行任务的服务器挂掉以后,其他同模块下的服务器可以立即顶上,继续执行任务)

上一篇下一篇

猜你喜欢

热点阅读