spring整合quartz
来源:互联网 发布:java 合并多个excel 编辑:程序博客网 时间:2024/06/15 02:55
其实quartz在真正项目中使用有两种方式,1种是使用servlet,一种是整合到spring中,今天记录一下后者,
毕竟绝大多数项目都使用了spring。
pom.xml如下,只有quartz和spring的jar依赖和一些编译版本和编码设置
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>quartz_spring</groupId> <artifactId>quartz_spring</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.version>4.2.2.RELEASE</spring.version> <quartz.version>2.2.2</quartz.version> </properties> <dependencies> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>${quartz.version}</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>${quartz.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> </dependencies></project>
其中最主要的jar是spring-context-support,其中org.springframework.scheduling.quartz帮我们实现了一些方法
方便我们整合quartz
步骤一:创建jobBean
我创建了两个普通bean、ScheduleJobA和ScheduleJobB(后2者实现了Job接口)用于例子展示,
并在ApplicationContext.xml中开启了包扫描
<context:component-scan base-package="jobs"></context:component-scan> <context:component-scan base-package="beans"></context:component-scan>
package beans;import org.springframework.stereotype.Component;@Component("myBean")public class MyBean { public void sayHello() { System.out.println("hello, i am bean"); }}
package beans;import org.springframework.stereotype.Component;@Component("anotherBean")public class AnotherBean { public void sayHello() { System.out.println("hello, i am anotherBean"); }}
package jobs;import beans.AnotherBean;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.stereotype.Component;@Componentpublic class ScheduleJobA implements Job { /* 所有属性都要放在jodDataMap里,在配置文件里添加,使用时再从jodDataMap取,不能直接注入 */// @Autowired// @Qualifier("anotherBean")// private AnotherBean anotherBean; public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { System.out.println("ScheduleJobA has worked"); System.out.println(jobExecutionContext.getMergedJobDataMap().get("name")); AnotherBean a = (AnotherBean)jobExecutionContext.getMergedJobDataMap().get("anotherBean"); a.sayHello(); // 直接注入时,属性为空// System.out.println(anotherBean == null);// this.anotherBean.sayHello(); }}
package jobs;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.springframework.beans.factory.annotation.Autowired;import beans.AnotherBean;import org.springframework.stereotype.Component;@Componentpublic class ScheduleJobB implements Job { public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { System.out.println("ScheduleJobB has worked"); }}
步骤二:配置jobBean
我们有2种方法声明配置一个jobBean
1.MethodInvokingJobDetailFactoryBean,我们只要指定一个普通的bean中的某个方法作为job的execute方法就行了,
这里我使用步骤一创建的MyBean
<!-- 指定一个普通类的某个方法作为任务 --> <bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="myBean" /> <property name="targetMethod" value="sayHello" /> </bean>
2.JobDetailFactoryBean,创建一个实现了Job接口的类,重写execute方法,这里我使用步骤一创建的ScheduleJobB <bean id="complexJobDetailB" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <property name="jobClass" value="jobs.ScheduleJobB" /> <property name="durability" value="true" /> </bean>
其中jobClass的值就是我们自己创建的job类的路径。当我们的job类要实现的业务比较复杂,比如需要引用一个外部类的对象,我们不能再像之前一样把该对象的引用
作为job类的属性,再由spring帮我们注入,这样会造成该对象注入失败,正确的方法是在配置jobBean时把
该对象存入jobDataMap中,下面是另一个JobDetailFactoryBean的配置,使用这里我使用
步骤一创建的ScheduleJobA
<bean id="complexJobDetailA" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <property name="jobClass" value="jobs.ScheduleJobA" /> <property name="jobDataMap"> <map> <entry key="anotherBean" value-ref="anotherBean" /> <entry key="name" value="holien"></entry> </map> </property> <property name="durability" value="true" /> </bean>
其中anotherBean就是我们要引用的外部的类,做测试时,我还在map里存另外一个name属性。步骤三:配置触发器
触发器也有两种,SimpleTriggerFactoryBean和CronTriggerFactoryBean
<!-- quartz触发器触发器配置 --> <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"> <property name="jobDetail" ref="simpleJobDetail" /> <!-- 推迟1秒后,每2秒执行一次 --> <property name="startDelay" value="1000" /> <property name="repeatInterval" value="2000" /> </bean> <bean id="cronTriggerA" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="complexJobDetailA" /> <!-- 每4秒执行一次 --> <property name="cronExpression" value="0/4 * * ? * *" /> </bean> <bean id="cronTriggerB" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="complexJobDetailB" /> <!-- 每10秒执行一次 --> <property name="cronExpression" value="0/10 * * ? * *" /> </bean>
使用同样是spring自带的SchedulerFactoryBean,把多个触发器存放在一个list中,当作其属性
<!-- quartz调度器配置 --> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="simpleTrigger"/> <ref bean="cronTriggerA" /> <ref bean="cronTriggerB" /> </list> </property> </bean>
步骤5:运行web项目,或者写一个Appmain方法来运行测试结果package beans;import org.springframework.context.support.AbstractApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class AppMain { public static void main(String[] args) { AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); }}
运行结果截图:阅读全文
0 0
- Spring-----Spring整合Quartz
- spring整合quartz
- spring整合quartz
- spring整合quartz
- Spring整合quartz配置
- Spring 整合quartz
- Spring整合quartz
- Spring整合Quartz示例
- spring整合quartz
- spring quartz框架整合
- spring跟QuartZ整合
- Spring-quartz整合
- Quartz 整合Spring 小试牛刀
- spring整合quartz
- spring整合quartz
- Spring+Quartz整合
- Spring整合Quartz
- spring和quartz整合
- codeblocks编译运行与调试
- 12.编写COM进程外组件
- [WUA APIs]CategoryCollection
- python3.5中,import sqlite3 出现 no module named _sqlite3的解决方法
- [WUA APIs]DownloadResults
- spring整合quartz
- HDU1302 The Snail
- [WUA APIs]InstallationResult
- Linux tail命令 监控日志的神器
- [WUA APIs]SearchResult
- Windows Server 2008使用无线网卡上网
- RN开工
- springmvc笔记-1-搭建
- 231. Power of Two