还没接触Quartz前,主要是用到java的Timer和TimerTask实现定时任务,一个web程序后台定时执行某个任务时,首先想到是使用监听器随容器一起启动,执行方法的任务的类继承TimerTask,在run方法中定义要执行的操作,在监听器中执行定时器的schedule方法,定义任务的执行间隔。
随后接触的Quartz框架,使用者只需要专注于任务的编写,学习起来也非常容易,Quartz原理不是很复杂,主要是以下几个概念:
Job表示一个工作
JobDetail具体的可执行的任务调度
Trigger调度参数的配置
Scheduler调度容器
简单的入门实例 首先导入quartz-2.2.0.jar和slf4j-api-1.6.6.jar,slf4j-log4j12-1.6.6.jar
MyJob.java
public class MyJob implements Job{
//定时执行的任务
public void execute(JobExecutionContext jobExecutionContext)throws JobExeceptionException{
System.out.println("welcome to....."+new Date());
}
}
TestJob.java
public class TestJob{
public static void main(String args[]) {
try {
//1创建一个JobDetail实例,指定MyJob
JobDetail jobDetail = new JobDetail("job1_1","jGroup1", MyJob.class);
//2通过SimpleTrigger定义调度规则:马上启动,每2秒运行一次,共运行100次
SimpleTrigger simpleTrigger = new SimpleTrigger("trigger1_1","tgroup1");
simpleTrigger.setStartTime(new Date());
simpleTrigger.setRepeatInterval(2000);
simpleTrigger.setRepeatCount(100);
//3通过SchedulerFactory获取一个调度器实例
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.scheduleJob(jobDetail, simpleTrigger);//④ 注册并进行调度
scheduler.start();//⑤调度启动
} catch (Exception e) {
e.printStackTrace();
}
}
}
spring与Quartz的整合
加入包的依赖
<!--quartz-->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>1.8.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.5.8</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.8</version>
</dependency>
web.xml中引入applicationContext-scheduler.xml
<!-- context-param section begin -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-*.xml</param-value>
</context-param>
编写任务的service方法
在applicationContext-scheduler.xml主要配置
<bean id="deletePassCars" class="com.tollgate.quartz.base.deletepasscars.DeletePasscars"/><!--定义执行的任务service-->
<bean id="deletePassCarsJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="concurrent">
<value>false</value>
</property>
<!--定义目标执行的任务service-->
<property name="targetObject">
<ref bean="deletePassCars"/>
</property>
<!--定义service中执行的方法-->
<property name="targetMethod">
<value>delete</value>
</property>
</bean>
<!--配置调度参数-->
<bean id="deletePassCarsTriggerBean" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<!--执行的具体任务-->
<property name="jobDetail">
<ref bean="deletePassCarsJobDetail"/>
</property>
<!--执行的间隔-->
<property name="startDelay"><value>5000</value></property>
<!--总共执行多少次停止-->
<property name="repeatInterval"><value>86400000</value></property></bean>
<!-- 执行任务 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref local="deletePassCarsTriggerBean"/>
</list>
</property>
</bean>
配置完成,启动容器,定时任务也随之启动了,使用起来非常方便。