三. Spring 创建任务Bean 实现整合 Quartz 框架
Spring 可以通过两种方式,来创建 任务Bean
- 继承 QuartzJobBean 类,用JobDetailFactoryBean 进行生成
- 创建普通java 对象和任务方法,用 MethodInvokingJobDetailFactoryBean 进行生成
下面,分别对这两种方式进行演示。
三.一 继承 QuartzJobBean 类
三.一.一 创建任务
/** * * @author 两个蝴蝶飞 * * 通过继承 QuartzJobBean 来创建作业任务Bean * */ public class MyJob3 extends QuartzJobBean{ @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { //要做的事,是打印当前的时间 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //格式化时间 String dateString=sdf.format(new Date()); System.out.println("QuartzJobBean 备份数据库的时间是:"+dateString); //可以通过 context 对象来获取一些重要信息 } }
其实 QuartzJobBean 内部 自己实现了 Job 接口, 然后 通过重写 executeInternal()方法来代替以前的 execute()方法。
三.一.二 编写配置文件 spring-quartz3.xml
<!-- 定义 JobDetail, 所用的bean 为 JobDetailFactoryBean --> <bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <!-- 任务名 --> <property name="name" value="job1"></property> <!-- 组名 --> <property name="group" value="group1"></property> <!-- 关联任务 --> <property name="jobClass" value="com.yjl.job.MyJob3"></property> <!-- 必须是true, 如果是false的话,当这个jobDetail没有被Trigger关联时,会删除 --> <property name="durability" value="true"></property> <!-- 还有一个重要的 applicationContextJobDataKey 属性,这一章节先不讲解--> </bean> <!-- 定义 cron 触发器 --> <bean id="trigger1" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <!-- 配置触发器的名称 --> <property name="name" value="trigger1"></property> <!-- 配置触发器的组名 --> <property name="group" value="group1"></property> <!-- 配置关联的 JobDetail --> <property name="jobDetail" ref="jobDetail"></property> <!-- 配置 cron 表达式 ,每2秒触发一次--> <property name="cronExpression" value="0/2 * * * * ?"></property> </bean> <!-- 配置 scheduler 调度器 --> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="trigger1"/> </list> </property> </bean>
与 二.四.一 部分的配置文件内容一样。
三.一.三 测试类进行测试查看
编写 JobTest3 测试类
package com.yjl.test; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath*:spring_quartz3.xml") public class JobTest3 { @Test public void test3(){ System.out.println("继承QuartzJobBean 是否运行任务呢?"); try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } }
运行,控制台打印输出:
三.二 普通Java 对象和任务方法
三.二.一 创建任务
/** * * @author 两个蝴蝶飞 * 普通的Java 类,普通的方法 */ public class MyJob4 { public void myExecute(){ //要做的事,是打印当前的时间 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //格式化时间 String dateString=sdf.format(new Date()); System.out.println("MethodInvoking 备份数据库的时间是:"+dateString); //如果要传递数据的话,需要自己在生成jobDetail时进行配置 } }
三.二.二 配置文件 spring-quartz4.xml
用 MethodInvokingJobDetailFactoryBean 来创建相应的JobDetail.
用 targetObject 和 targetMethod 属性来指定 哪一个类的哪一个方法。
<!-- 定义 JobDetail, 所用的bean 为 MethodInvokingJobDetailFactoryBean --> <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 任务名 --> <property name="name" value="job1"></property> <!-- 组名 --> <property name="group" value="group1"></property> <!--是否同步--> <property name="concurrent" value="true"></property> <!-- 哪一个任务 --> <property name="targetObject"> <bean class="com.yjl.job.MyJob4"></bean> </property> <!-- 哪一个方法 --> <property name="targetMethod" value="myExecute"></property> </bean> <!-- 定义 cron 触发器 --> <bean id="trigger1" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <!-- 配置触发器的名称 --> <property name="name" value="trigger1"></property> <!-- 配置触发器的组名 --> <property name="group" value="group1"></property> <!-- 配置关联的 JobDetail --> <property name="jobDetail" ref="jobDetail"></property> <!-- 配置 cron 表达式 ,每2秒触发一次--> <property name="cronExpression" value="0/2 * * * * ?"></property> </bean> <!-- 配置 scheduler 调度器 --> <bean id="scheduler1" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="trigger1"/> </list> </property> </bean>
三.二.三 测试文件测试
编写 JobTest4.java 测试类
package com.yjl.test; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath*:spring_quartz4.xml") public class JobTest4 { @Test public void test4(){ System.out.println("自定义类和方法是否运行任务呢?"); try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } }
注意,此时是先输出语句,再运行6次。
这就是 Spring 整合 Quartz框架的几种方式,老蝴蝶强烈建议使用第3种,继承 QuartzJobBean的方式。