quartz系列(二):动态定时任务管理
来源:互联网 发布:惠州淘宝培训班 编辑:程序博客网 时间:2024/05/07 01:06
quartz系列(二):动态定时任务管理
在此篇文章中,探讨一下对quartz任务的动态管理。基本思路是创建两张表分别存放Job、Trigger相关信息,项目启动时加载所有任务,在页面可查看状态、以及进行任务管理操作。功能如下图所示:
作业是由作业名称、作业组来唯一确定的,共同组成JobKey、TriggerKey;在创建定时作业时,先行构建任务和触发器,继而在调度器中生成作业,对其进行监控管理。
主要功能类JobUtil.java:
public class JobUtil { private final static Logger logger = LogManager.getLogger(); /** * 获取JobKey * @param job * @return */ public static JobKey getJobKey(QuartzJob job){ return JobKey.jobKey(job.getJobName(), job.getJobGroup()); } /** * 获取TriggerKey * @param job * @return */ public static TriggerKey getTriggerKey(QuartzJob job){ return TriggerKey.triggerKey(job.getJobName(), job.getJobGroup()); } /** * 获取CronTrigger * @param scheduler * @param job * @return */ public static CronTrigger getCronTrigger(Scheduler scheduler, QuartzJob job){ try { TriggerKey triggerKey = getTriggerKey(job); return (CronTrigger) scheduler.getTrigger(triggerKey); } catch (SchedulerException e) { logger.error(e); } return null; } /** * 新增Job * @param scheduler * @param job * @throws ClassNotFoundException */ public static void insertJob(Scheduler scheduler, QuartzJob quartzJob) throws ClassNotFoundException{ String jobName = quartzJob.getJobName(); String jogGroup = quartzJob.getJobGroup(); String cronExpression = quartzJob.getCronExpression(); Class _class = Class.forName(quartzJob.getJobClassName()); //构建任务 JobDetail jobDetail = JobBuilder.newJob(_class).withIdentity(jobName, jogGroup).build(); //放入参数,在运行时获取 jobDetail.getJobDataMap().put(Cast.job_params, quartzJob); //构建调度表达式 CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression); //构建trigger CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(jobName, jogGroup) .withSchedule(cronScheduleBuilder).build(); try { //构建job scheduler.scheduleJob(jobDetail, cronTrigger); } catch (SchedulerException e) { //日志记录 logger.error(e); } } /** * 运行一次 * @param scheduler * @param job * @throws SchedulerException */ public static void runJob(Scheduler scheduler, QuartzJob job) throws SchedulerException{ JobKey jobKey = getJobKey(job); scheduler.triggerJob(jobKey); } /** * 更新定时任务 * @param scheduler * @param job */ public static void updateJob(Scheduler scheduler, QuartzJob job){ try { TriggerKey triggerKey = getTriggerKey(job); String cronExpression = job.getCronExpression(); //构建调度表达式 CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression); CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey); //重新构建trigger cronTrigger = cronTrigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build(); scheduler.rescheduleJob(triggerKey, cronTrigger); } catch (SchedulerException e) { logger.error(e); } } /** * 删除任务 * @param scheduler * @param job */ public static void deleteJob(Scheduler scheduler, QuartzJob job){ try { JobKey jobKey = getJobKey(job); scheduler.deleteJob(jobKey); } catch (SchedulerException e) { logger.error(e); } } /** * 暂停任务 * @param scheduler * @param job */ public static void pauseJob(Scheduler scheduler, QuartzJob job){ try { JobKey jobKey = getJobKey(job); scheduler.pauseJob(jobKey); } catch (SchedulerException e) { logger.error(e); } }}
初始化类InitQuartzServlet.java:
public class InitQuartzServlet { private final static Logger logger = LogManager.getLogger(); @Resource private IQuartzJobDao quartzJobDao; @Resource private Scheduler scheduler; /** * 项目启动时,初始化Job */ public void init(){ try { List<QuartzJob> list = quartzJobDao.selJob(new QuartzJob()); for(QuartzJob quartzJob : list){ CronTrigger cronTrigger = JobUtil.getCronTrigger(scheduler, quartzJob); if(Util.isEmpty(cronTrigger)){ JobUtil.insertJob(scheduler, quartzJob); }else{ JobUtil.updateJob(scheduler, quartzJob); } } } catch (Exception e) { logger.error(e); } }}
在配置文件spring-mvc-config.xml增加以下配置即可:
< bean id = "InitQuartzServlet" lazy-init = "false" class = "io.hexin.quartz.InitQuartzServlet" init-method = "init" />
spring-quartz.xml文件,只需要配置jobFactory :
<bean id= "schedulerFactoryBean" class ="org.springframework.scheduling.quartz.SchedulerFactoryBean" > <property name= "jobFactory"> <bean class ="io.hexin.quartz.JobFactory" ></ bean> </property></bean >
JobFactory.java:
public class JobFactory extends SpringBeanJobFactory{ @Resource private AutowireCapableBeanFactory beanFactory; public JobFactory(){ } @Override protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { Object jobInstance = super.createJobInstance(bundle); beanFactory.autowireBean(jobInstance); return jobInstance; }}
测试类TestJob.java:
public class TestJob extends BaseJob implements Job{ @Override public void execute(JobExecutionContext context) throws JobExecutionException { //执行内容 System. out .println(new Date()); //更新最后执行时间 super .updateLastExecuteTime(context); }}
(全文完)
我的微博:http://weibo.com/ahmumu
0 0
- quartz系列(二):动态定时任务管理
- Quartz动态定时任务管理
- quartz动态定时任务
- quartz 定时任务管理
- spring mvc quartz 实现动态定时任务管理
- Quartz动态管理一次性定时任务(Spring)
- Spring Quartz动态管理定时任务及相关问题总结
- Quartz动态管理任务
- quartz 配置 动态定时任务
- Quartz实现动态定时任务
- quartz实现动态定时任务
- Quartz实现动态定时任务
- Quartz实现动态定时任务
- 动态定义quartz定时任务
- spring+quartz定时任务管理
- 定时任务设计(二):Quartz
- 【转载】Quartz动态管理任务
- Quartz动态调控任务管理
- Spark内核天机解密(2016)第三讲 Scala函数式编程
- luerl 测试用例
- 自己第一次为cell写的协议方法
- 跟我学习dubbo-简介(1)
- QT中QMainWindow手动添加菜单栏以及其他控件
- quartz系列(二):动态定时任务管理
- 清除空出的多余的cell的线
- Android 异步完全解析
- c++中的iostream
- 跟我学习dubbo-ZooKeeper注册中心安装(2)
- python 对ACCESS数据库操作封装模块
- C语言字符串使用...
- 转载自博客园
- 贪心算法(转载自博客园)