Spring中Quartz定时任务的一般操作方法 如何暂停 恢复 启动 添加任务

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 就可以对整个任务进行操作了,所以难点在于如何获取SchedulerTrigger

如关闭和启动

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/天,具体规则查看活动详情Blog Img