您的位置:首页 > 编程语言 > Java开发

Spring定时任务的实现方式--Quartz

2016-11-04 18:27 513 查看
首先准备相应的jar包:

如果是maven工程,直接引入相关的依赖包:

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>

或者直接下载相关的jar包:

quartz-1.8.6.jar    spring-context-support-3.2.0.RELEASE.jar

特别注意一点,与Spring3.1以下版本整合必须使用Quartz1,最初我拿2.0.2的,怎么搞都报错(参考:http://blog.csdn.net/qq_32786873/article/details/53037908)

方式一:作业类继承自特定的基类:org.springframework.scheduling.quartz.QuartzJobBean

1.编写作业类,继承QuartzJobBean

package com.Solin.Timer;

import java.util.Date;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

public class QuartzJob1 extends QuartzJobBean{
private int timeout;
public void setTimeout(int timeout) {
this.timeout = timeout;
}
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
String dog = (String)context.getMergedJobDataMap().get("dog");
System.out.println(new Date()+"定时任务执行中…"+"---timeout="+this.timeout+"---dog:"+dog);
}

}


2.spring配置文件中配置作业类JobDetailBean

<!--方式一:使用JobDetailBean,任务类必须继承QuartzJobBean类 -->
<bean name="job1" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.Solin.Timer.QuartzJob1" />
<property name="jobDataAsMap">
<map>
<entry key="timeout" value="2" />
<entry key="dog" value="This is dog!" />
</map>
</property>
</bean>


3.配置作业调度的触发方式(触发器)

Quartz的作业触发器有两种,分别是

org.springframework.scheduling.quartz.SimpleTriggerBean

org.springframework.scheduling.quartz.CronTriggerBean

第一种SimpleTriggerBean,只支持按照一定频度调用任务,如每隔30分钟运行一次。

配置方式如下:

<!-- ======================== 调度触发器 ======================== -->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="job1" />
<property name="startDelay" value="0" /><!-- 调度工厂实例化后,经过0秒开始执行调度 -->
<property name="repeatInterval" value="2000" /><!-- 每2秒调度一次 -->
</bean>
第二种CronTriggerBean,支持到指定时间运行一次,如每天12:00运行一次等。

配置方式如下:

<!-- ======================== 调度触发器 ======================== -->
<bean id="CronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerBean">
<span style="white-space:pre">	</span><property name="jobDetail" ref="job1"></property>
<!-- 每5秒运行一次 -->
<property name="cronExpression" value="0/5 * * * * ?"></property>
</bean>


关于cronExpression表达式的值,参考:http://blog.csdn.net/qq_32786873/article/details/53010550

4.配置调度工厂

<!-- ======================== 调度工厂 ======================== -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="simpleTrigger" />
</list>
</property>
</bean>


说明:该参数指定的就是之前配置的触发器的名字

5.启动应用

使用触发器SimpleTriggerBean,输出结果:

Fri Nov 04 18:17:50 CST 2016定时任务执行中…---timeout=2---dog:This is dog!
Fri Nov 04 18:17:52 CST 2016定时任务执行中…---timeout=2---dog:This is dog!
Fri Nov 04 18:17:54 CST 2016定时任务执行中…---timeout=2---dog:This is dog!
Fri Nov 04 18:17:56 CST 2016定时任务执行中…---timeout=2---dog:This is dog!
Fri Nov 04 18:17:58 CST 2016定时任务执行中…---timeout=2---dog:This is dog!
使用触发器CronTriggerBean,输出结果:

Fri Nov 04 18:26:55 CST 2016定时任务执行中…---timeout=2---dog:This is dog!
Fri Nov 04 18:27:00 CST 2016定时任务执行中…---timeout=2---dog:This is dog!
Fri Nov 04 18:27:05 CST 2016定时任务执行中…---timeout=2---dog:This is dog!
Fri Nov 04 18:27:10 CST 2016定时任务执行中…---timeout=2---dog:This is dog!
Fri Nov 04 18:27:15 CST 2016定时任务执行中…---timeout=2---dog:This is dog!


方式二:作业类不继承特定基类。

1.编写作业类

package com.Solin.Timer;

import java.util.Date;

public class QuartzJob2 {
public void doJob2() {
System.out.println(new Date()+" 不继承QuartzJobBean方式-调度进行中...");
}
}


2.配置作业类

<!-- 方式二:使用MethodInvokingJobDetailFactoryBean,任务类可以不继承QuartzJobBean类,通过targetMethod指定调用方法-->
<bean id="job2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<bean class="com.Solin.Timer.QuartzJob2" />
</property>
<property name="targetMethod" value="doJob2" /><!-- 要执行的方法名称 -->
<property name="concurrent" value="false" /><!-- 作业不并发调度 -->
</bean>


3.配置作业调度的触发方式(触发器)

Quartz的作业触发器有两种,分别是
org.springframework.scheduling.quartz.SimpleTriggerBean
org.springframework.scheduling.quartz.CronTriggerBean
第一种SimpleTriggerBean,只支持按照一定频度调用任务,如每隔30分钟运行一次。
配置方式如下:

<!-- ======================== 调度触发器 ======================== -->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="job2" />
<property name="startDelay" value="0" />调度工厂实例化后,经过0秒开始执行调度
<property name="repeatInterval" value="2000" />每2秒调度一次
</bean>
第二种CronTriggerBean,支持到指定时间运行一次,如每天12:00运行一次等。

配置方式如下:

<!-- ======================== 调度触发器 ======================== -->
<bean id="CronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="job2"></property>
<!-- 每5秒运行一次 -->
<property name="cronExpression" value="0/5 * * * * ?"></property>
</bean>
关于cronExpression表达式的值,参考:http://blog.csdn.net/qq_32786873/article/details/53010550

4.配置调度工厂

<!-- ======================== 调度工厂 ======================== -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="simpleTrigger" />
</list>
</property>
</bean>  


说明:该参数指定的就是之前配置的触发器的名字

5.启动应用

使用触发器SimpleTriggerBean,输出结果:

Fri Nov 04 18:41:33 CST 2016 不继承QuartzJobBean方式-调度进行中...
Fri Nov 04 18:41:35 CST 2016 不继承QuartzJobBean方式-调度进行中...
Fri Nov 04 18:41:37 CST 2016 不继承QuartzJobBean方式-调度进行中...
Fri Nov 04 18:41:39 CST 2016 不继承QuartzJobBean方式-调度进行中...
Fri Nov 04 18:41:41 CST 2016 不继承QuartzJobBean方式-调度进行中...


使用触发器CronTriggerBean,输出结果:

Fri Nov 04 18:43:50 CST 2016 不继承QuartzJobBean方式-调度进行中...
Fri Nov 04 18:43:55 CST 2016 不继承QuartzJobBean方式-调度进行中...
Fri Nov 04 18:44:00 CST 2016 不继承QuartzJobBean方式-调度进行中...
Fri Nov 04 18:44:05 CST 2016 不继承QuartzJobBean方式-调度进行中...
Fri Nov 04 18:44:10 CST 2016 不继承QuartzJobBean方式-调度进行中...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: