Quartz动态加载TASK
Posted PC猪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Quartz动态加载TASK相关的知识,希望对你有一定的参考价值。
版权声明:本文为博主原创文章,未经博主允许不得转载。 <!-- 定时任务 --> <bean id="schedulerManager" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" <property name="triggers"> <list> <ref bean="quartzManagerTrigger" /> </list> </property> </bean> <!-- 主定时计划 --> <bean id="quartzManagerTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail" ref="quartzManagerJobDetail" /> <!-- 延时1秒 执行任务 --> <property name="startDelay" value="1000" /> <!-- 任务执行周期 6秒 --> <property name="repeatInterval" value="20000" /> </bean> <bean id="quartzManagerJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="quartzManagerBean" /> <property name="targetMethod" value="reScheduleJob" /> <property name="concurrent" value="false" /> </bean> <bean id="quartzManagerBean" class="com.jiuyu.batchServer.bussiness.reservedrpt.action.QuartzManager" init-method="initMethod"> <property name="scheduler" ref="schedulerManager" /> <property name="taskService" ref="taskService"/> </bean> public class QuartzManager implements BeanFactoryAware { @SuppressWarnings("unused") private void reScheduleJob() throws Exception, ParseException { // 通过查询数据库里计划任务来配置计划任务 LOG.info("reScheduleJob---->"+new Date()); Map paramMap = new HashMap(); List paramList = new ArrayList(); paramList.add("0");//待运行 paramList.add("2");//待删除 paramMap.put("paramList", paramList); List<TaskVo> quartzList = taskService.selectTaskIsNotDelete(paramMap);//查询不为1和3的任务(已加入,已删除) if (quartzList != null && quartzList.size() > 0) { for (TaskVo tbcq1 : quartzList) { configQuatrz(tbcq1); } } } public boolean configQuatrz(TaskVo tbcq) { boolean result = false; try { // 运行时可通过动态注入的scheduler得到trigger CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger( String.valueOf(tbcq.getTaskId()), Scheduler.DEFAULT_GROUP); // 如果计划任务已存在则调用修改方法 if (trigger != null) { change(tbcq, trigger); } else { // 如果计划任务不存在并且数据库里的任务状态为可用时,则创建计划任务 if (tbcq.getState().equals("0")) { this.createCronTriggerBean(tbcq); } else { tbcq.setState("3");//已加入 taskService.updateTaskFile(tbcq); } } result = true; } catch (Exception e) { result = false; e.printStackTrace(); } return result; } public void change(TaskVo tbcq, CronTriggerBean trigger) throws Exception { // 如果任务为可用 if (tbcq.getState().equals("0")) { // 判断从DB中取得的任务时间和现在的quartz线程中的任务时间是否相等 // 如果相等,则表示用户并没有重新设定数据库中的任务时间,这种情况不需要重新rescheduleJob if (!trigger.getCronExpression().equalsIgnoreCase( tbcq.getExpression())) { trigger.setCronExpression(tbcq.getExpression()); scheduler.rescheduleJob(String.valueOf(tbcq.getTaskId()), Scheduler.DEFAULT_GROUP, trigger); } tbcq.setState("1");//已加入 taskService.updateTaskFile(tbcq); LOG.info(new Date() + ": 更新" + String.valueOf(tbcq.getTaskId()) + "计划任务"); } else {//删除 // 不可用 scheduler.pauseTrigger(String.valueOf(tbcq.getTaskId()), trigger.getGroup());// 停止触发器 scheduler.unscheduleJob(String.valueOf(tbcq.getTaskId()), trigger.getGroup());// 移除触发器 scheduler.deleteJob(String.valueOf(tbcq.getTaskId()), trigger.getJobGroup());// 删除任务 tbcq.setState("3"); taskService.updateTaskFile(tbcq); LOG.info(new Date() + ": 删除" + String.valueOf(tbcq.getTaskId()) + "计划任务"); } } /** * 创建/添加计划任务 * * @param tbcq * 计划任务配置对象 * @throws Exception */ public void createCronTriggerBean(TaskVo tbcq) throws Exception { // 新建一个基于Spring的管理Job类 MethodInvokingJobDetailFactoryBean mjdfb = new MethodInvokingJobDetailFactoryBean(); mjdfb.setName(String.valueOf(tbcq.getTaskId()));// 设置Job名称 // 如果定义的任务类为Spring的定义的Bean则调用 getBean方法 if ("1".equals(tbcq.getIsspringbean())) { mjdfb.setTargetObject(beanFactory.getBean(tbcq.getClassName()));// 设置任务类 } else { // 否则直接new对象 mjdfb.setTargetObject(Class.forName(tbcq.getClassName()) .newInstance());// 设置任务类 } Object[] arguments = new Object[1]; arguments[0] = tbcq; mjdfb.setArguments(arguments); mjdfb.setTargetMethod(tbcq.getMethod());// 设置任务方法 //mjdfb.setConcurrent(tbcq.getConcurrent().equals("0") ? false : true); // 设置是否并发启动任务 mjdfb.setConcurrent(false);//不并发 mjdfb.afterPropertiesSet();// 将管理Job类提交到计划管理类 // 将Spring的管理Job类转为Quartz管理Job类 JobDetail jobDetail = new JobDetail(); jobDetail = (JobDetail) mjdfb.getObject(); jobDetail.setName(String.valueOf(tbcq.getTaskId())); scheduler.addJob(jobDetail, true); // 将Job添加到管理类 // 新一个基于Spring的时间类 CronTriggerBean c = new CronTriggerBean(); c.setCronExpression(tbcq.getExpression());// 设置时间表达式 c.setName(String.valueOf(tbcq.getTaskId()));// 设置名称 c.setJobDetail(jobDetail);// 注入Job c.setJobName(String.valueOf(tbcq.getTaskId()));// 设置Job名称 scheduler.scheduleJob(c);// 注入到管理类 scheduler.rescheduleJob(String.valueOf(tbcq.getTaskId()), Scheduler.DEFAULT_GROUP, c);// 刷新管理类 tbcq.setState("1");//已加入 taskService.updateTaskFile(tbcq); LOG.info(new Date() + ": 新建" + String.valueOf(tbcq.getTaskId()) + "计划任务"); } public void setBeanFactory(BeanFactory factory) throws BeansException { this.beanFactory = factory; } public BeanFactory getBeanFactory() { return beanFactory; } }
以上是关于Quartz动态加载TASK的主要内容,如果未能解决你的问题,请参考以下文章
180729-Quick-Task 动态脚本支持框架之任务动态加载
Spring Cloud Task 主要是干什么的啊?跟 Quartz 和 Spring Task 有啥关系?
Spring Cloud Task 主要是干什么的啊?跟 Quartz 和 Spring Task 有啥关系?
Spring Batch 与 Spring Cloud Task Quartz 等概念辨析