Spring中Quartz定时任务的一般操作方法 如何暂停 恢复 启动 添加任务
前天有一个网友突然向我问起,怎么在网友上点击按钮暂停任务,或启动任务等
由于我之前也没有遇到过这样的问题,所以我也打算自己练习一下
不过还好,当天就完成了这些测试,现在我将简要的方法步骤分享给大家,注意,以下代码仅是测试,具体的功能完成,请自行补充
本例主要是用到了Spring的依赖注入来实现
首先请看我们的job类,我先行说明,后面贴完整代码
job类中定义了4个方法 test() test1() test2() test3()
cronTrigger cronTrigger1 cronTrigger2 cronTrigger3 表示我们的四个任务
而其中 command 、scheduler 、cronTrigger 、cronTrigger1 、cronTrigger2 、cronTrigger3 共六个私有变量的获取均是由Spring注入获得,当然需要提供set方法,以下为全部的代码
package com.spring.jobquartz2; import java.util.Date; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.Trigger; public class QuartzJob{ // private Trigger triggers; /* * 通过依赖注入获得以下5个私有变量 * 并且提供了set方法,这是必须的 */ private Scheduler scheduler; private Trigger cronTrigger; private Trigger cronTrigger1; private Trigger cronTrigger2; private Trigger cronTrigger3; private String command; public void setCommand(String command){ this.command = command; } // public void setTriggers(Trigger triggers) { // this.triggers = triggers; // } public void setScheduler(Scheduler scheduler) { this.scheduler = scheduler; } public void setCronTrigger(Trigger cronTrigger) { this.cronTrigger = cronTrigger; } public void setCronTrigger1(Trigger cronTrigger1) { this.cronTrigger1 = cronTrigger1; } public void setCronTrigger2(Trigger cronTrigger2) { this.cronTrigger2 = cronTrigger2; } public void setCronTrigger3(Trigger cronTrigger3) { this.cronTrigger3 = cronTrigger3; } public void test() throws SchedulerException{ //取消所有的作业,但是我们让第一个作业永远执行 //scheduler.unscheduleJob(cronTrigger.getKey()); scheduler.pauseJob(cronTrigger1.getJobKey()); scheduler.pauseJob(cronTrigger2.getJobKey()); scheduler.pauseJob(cronTrigger3.getJobKey()); if(scheduler.isStarted()){ scheduler.rescheduleJob(cronTrigger2.getKey(), cronTrigger2); scheduler.rescheduleJob(cronTrigger1.getKey(), cronTrigger1); System.out.println("command "+new Date()); }else{ System.out.println("没有启动"); } } public void test1(){ System.out.println("运行了方法1 "+new Date()); } public void test2(){ System.out.println("运行了方法2 "+new Date()); } public void test3(){ System.out.println("运行了方法3 "+new Date()); } }
Scheduler变量就是我们的任务工厂
所谓工厂,就是可以向里面添加,删除,修改的一个东西
Trigger变量就相当于是工厂里面的部件
所有部件,就是您可以获取他的名字等各种状态
由此,我们现在可以先简单的看看test()方法了
注意:配置文件请先略过,下面会有的,不要着急
因为配置文件中我们定义的启动所有的任务
所有test()方法首先我们就暂停了这些方法
通过任务工厂Scheduler的pauseJob方法
scheduler.pauseJob(cronTrigger1.getJobKey());
这里我们取消了cronTrigger1 cronTrigger2 cronTrigger3 这三个任务
被我注释掉的代码
//scheduler.unscheduleJob(cronTrigger.getKey());表示取消任务哦
再接着看,scheduler.isStarted()方法表示检查任务是否被启动,我启动返回true
然后我们通过scheduler.rescheduleJob方法恢复任务
以下代码表示恢复cronTrigger1 和 cronTrigger2 任务
scheduler.rescheduleJob(cronTrigger2.getKey(), cronTrigger2); scheduler.rescheduleJob(cronTrigger1.getKey(), cronTrigger1);刚刚我们说到Trigger表示工厂里面的部件,他可以获得名称等一些状态
所以我们上面的代码用到了这些方法
cronTrigger1.getJobKey() 获取 jobkey
cronTrigger1.getKey() 获取TriggerKey
总结:
其实只要我们获取到了 Scheduler 和 Trigger 就可以对整个任务进行操作了,所以难点在于如何获取Scheduler和Trigger
如关闭和启动
scheduler.shutdown(); 关闭任务
scheduler.start(); 启动任务
添加任务
scheduler.addJob(arg0, arg1);
更多方法可自行查看api文档,不想查看您可以在IDE里面输入 scheduler 在输入 点 ,你就可以看见了
下面我们看看配置文件怎么配置的 applicationContext2.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="spring_quartzjob" class="com.spring.jobquartz2.QuartzJob"> <property name="command"> <value>spring更新</value> </property> <!-- property name="triggers" ref="simpleTrigger" / --> <property name="cronTrigger" ref="cronTrigger" /> <property name="cronTrigger1" ref="cronTrigger1" /> <property name="cronTrigger2" ref="cronTrigger2" /> <property name="cronTrigger3" ref="cronTrigger3" /> <property name="scheduler" ref="quartzFactory" /> </bean> <!-- 指定方法位置 --> <bean id="MethodInvoking" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="spring_quartzjob" /> <property name="targetMethod" value="test" /> </bean> <!-- 指定方法位置1 --> <bean id="MethodInvoking1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="spring_quartzjob" /> <property name="targetMethod" value="test1" /> </bean> <!-- 指定方法位置2 --> <bean id="MethodInvoking2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="spring_quartzjob" /> <property name="targetMethod" value="test2" /> </bean> <!-- 指定方法位置3 --> <bean id="MethodInvoking3" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="spring_quartzjob" /> <property name="targetMethod" value="test3" /> </bean> <!-- 定义触发器-1,简单触发器 --> <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"> <!-- 指定我们的bean --> <property name="jobDetail" ref="MethodInvoking" /> <!-- 延迟多长时间调用 --> <property name="startDelay"> <value>1000</value> </property> <!-- 每隔多长时间调用一次 --> <property name="repeatInterval"> <value>3000</value> </property> </bean> <!-- 表达式触发器-2, 指定时间执行任务 --> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="MethodInvoking" /> <property name="cronExpression"> <value>0 * * * * ?</value> </property> </bean> <!-- 表达式触发器-2, 指定时间执行任务 --> <bean id="cronTrigger1" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="MethodInvoking1" /> <property name="cronExpression"> <value>15 * * * * ?</value> </property> </bean> <!-- 表达式触发器-2, 指定时间执行任务 --> <bean id="cronTrigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="MethodInvoking2" /> <property name="cronExpression"> <value>30 * * * * ?</value> </property> </bean> <!-- 表达式触发器-2, 指定时间执行任务 --> <bean id="cronTrigger3" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="MethodInvoking3" /> <property name="cronExpression"> <value>45 * * * * ?</value> </property> </bean> <!-- 启动任务 --> <bean id="quartzFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <!-- ref local="simpleTrigger"/ --> <ref local="cronTrigger"/> <ref local="cronTrigger1"/> <ref local="cronTrigger2"/> <ref local="cronTrigger3"/> </list> </property> </bean> </beans>注意看以上代码
在bean spring_quartzjob中command
command 、scheduler 、cronTrigger 、cronTrigger1 、cronTrigger2 、cronTrigger3 由Spring注入完成
相关的注入bean在该文档都有配置
既配置了4个Trigger 和4个MethodInvoking ,因为一个Trigger对应 一个MethodInvoking
还配置了一个 scheduler
自此所有配置完成,测试代码很简单,一句代码
public class RunQuartz { public static void main(String[] args) { ClassPathXmlApplicationContext cpx = new ClassPathXmlApplicationContext("applicationContext2.xml"); } }
注意,本例测试本地测试,如果您要放到web中去运行,您可以这样,定义一个变量,在任务启动时读取该变量,不同的变量执行不同的任务即可。
爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情