spring整合quartz有两种任务存储方式,RAM存储方式和JDBC存储方式,企业开发使用的JDBC存储方式。
先从RAM存储方式开始说起
目录
依赖org.springframework.scheduling.quartz.JobDetailFactoryBean
依赖org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
Jar包依赖
因为整合spring过程中对quartz和spring都有版本上的要求,便于管理使用maven
<!-- quartz 的jar -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
<!-- spring相关jar -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>4.0.5.RELEASE</version>
</dependency>
<!-- 日志相关jar包 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.5</version>
</dependency>
<dependency><!-- Failed to load class "org.slf4j.impl.StaticLoggerBinder". -->
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.13</version>
</dependency>
<!-- MySql的包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.31</version>
</dependency>
quartz-config.xml
将quartz的创建交给spring,整合的步骤
创建jobDetail
spring中有两种方式:
依赖org.springframework.scheduling.quartz.JobDetailFactoryBean
要求任务类必须实现job接口,而且需要将durability属性配置为true,否则容器初始化时候,因为没有触发器和任务关联会报错。
工作类:
public class HelloJob implements Job{
public void execute(JobExecutionContext paramJobExecutionContext)
throws JobExecutionException {
System.out.println("触发simpleScheduler的任务.....");
}
}
<!-- 定义任务1-->
<bean id="jobDetail1" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<!-- 定义job名称,group名称 -->
<property name="name" value="myjob1"></property>
<property name="group" value="group1"></property>
<!-- 指定job类 -->
<property name="jobClass" value="cn.bing.quartz.HelloJob"></property>
<!-- 必须设置为true,当没有活动的触发器和任务关联,调度器会自动删除任务 -->
<property name="durability" value="true"></property>
<!-- 指定spring上下文容器的key,这样在execute方法中,就能获取到上下文,从而获取到bean -->
<property name="applicationContextJobDataKey" value="applicationContext"></property>
</bean>
依赖org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
不要求任务类必须实现job接口
工作类:
public class TestJob {
public void work(){
System.out.println("北京时间:"+new SimpleDateFormat("yyyyMMdd HH:mm:ss").format(new Date())+"执行cron触发的任务");
}
}
<bean id="jobDetail2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 指定工作类 -->
<property name="targetObject">
<bean class="cn.bing.quartz.TestJob"></bean>
</property>
<!-- 工作类的执行方法 -->
<property name="targetMethod">
<value>work</value>
</property>
</bean>
创建触发器
创建两种常见的触发器simpleTrigger和cronTrigger,分别注册到上面两种方式生成的jobDetail
创建SimpleTrigger
<!-- 定义触发器 -->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<!-- 定义触发器名称 -->
<property name="name" value="trigger1"></property>
<!-- 定义所属组的名称 -->
<property name="group" value="group1"></property>
<!-- 执行间隔是5s -->
<property name="repeatInterval" value="5000"></property>
<!-- 执行次数10次 -->
<property name="repeatCount" value="10"></property>
<!-- 绑定的任务 -->
<property name="jobDetail" ref="jobDetail1"></property>
</bean>
创建CronTrigger
<!-- 定义cron触发器 -->
<!-- 2.2:定义触发器的bean,定义一个Cron的Trigger,一个触发器只能和一个任务进行绑定 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<!-- 指定Trigger的名称 -->
<property name="name" value="hw_trigger"/>
<!-- 指定Trigger的名称 -->
<property name="group" value="hw_trigger_group"/>
<!-- 指定Tirgger绑定的Job -->
<property name="jobDetail" ref="jobDetail2"/>
<!-- 指定Cron 的表达式 ,当前是每隔1s运行一次 -->
<property name="cronExpression" value="0/1 * * * * ?" />
</bean>
定义调度器scheduler
将触发器注册到任务中
<!-- 定义调度器,将触发器注册到任务中 -->
<bean id="scheduler1" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
lazy-init="false"
>
<property name="triggers">
<list>
<ref bean="simpleTrigger"/>
<ref bean="cronTrigger"/>
</list>
</property>
</bean>
测试
public class JunitTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
}
}
spring容器创建,就会启动quartz,触发任务执行
执行结果:
北京时间:20180802 14:55:25: 执行cron触发的任务
14:55:25.004 [scheduler1_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
14:55:25.540 [scheduler1_Worker-4] DEBUG org.quartz.core.JobRunShell - Calling execute on job group1.myjob1
14:55:25.541 [scheduler1_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
北京时间:20180802 14:55:25: 执行simpleScheduler触发的任务.....
14:55:26.001 [scheduler1_Worker-5] DEBUG org.quartz.core.JobRunShell - Calling execute on job DEFAULT.jobDetail2
北京时间:20180802 14:55:26: 执行cron触发的任务
14:55:26.003 [scheduler1_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
14:55:27.003 [scheduler1_Worker-6] DEBUG org.quartz.core.JobRunShell - Calling execute on job DEFAULT.jobDetail2
14:55:27.003 [scheduler1_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
北京时间:20180802 14:55:27: 执行cron触发的任务
参考博客:https://blog.csdn.net/u010648555/article/details/54891264