先贴出示例的完整的上下文文件(个人使用的是A方案简单实现)。
QuartzTask是业务处理类,work是QuartzTask需要定时执行的方法(QuartzTask+quartz-context.xml即可实现定时任务)
src/main/resources/quartz-context.xml
- <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-4.0.xsd">
<!-- ********************** Quartz调度任务 begin 配置跑批***************** -->
<!-- 线程执行器配置,用于任务注册
<bean id="executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="10" />
<property name="maxPoolSize" value="100" />
<property name="queueCapacity" value="500" />
</bean>-->
<!-- =============要调度的工作类(业务对象)============= 将需要添加定时任务调度的类配置到这里 -->
<bean id="quartzTask" class="com.didi.opms.common.util.QuartzTask"/>
<!-- ============= 调度业务(定义调用对象和调用对象的方法)============= -->
<bean id="jobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 要调用的对象 -->
<property name="targetObject" ref="quartzTask" />
<!-- 要执行的方法名称 -->
<property name="targetMethod" value="work" />
<!-- 如果前一个任务还没有结束第二个任务不会启动 false -->
<property name="concurrent" value="false" />
</bean>
<!-- ============= 调度触发器 ============= -->
<bean id="simpleTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="jobDetail" />
<!-- 每隔3秒钟审批一次 (cron 表达式)
Cron表达式范例:
每隔5秒执行一次:*/5 * * * * ?
每隔1分钟执行一次:0 */1 * * * ?
每天23点执行一次:0 0 23 * * ?
每天凌晨1点执行一次:0 0 1 * * ?
每月1号凌晨1点执行一次:0 0 1 1 * ?
每月最后一天23点执行一次:0 0 23 L * ?
每周星期天凌晨1点实行一次:0 0 1 ? * L
在26分、29分、33分执行一次:0 26,29,33 * * * ?
每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?-->
<property name="cronExpression" value="0 0 23 * * ?" />
</bean>
<!-- ============= 调度工厂 ============= -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
lazy-init="false">
<property name="triggers">
<list>
<ref bean="simpleTrigger" />
</list>
</property>
</bean>
<!-- **************** Quartz调度任务 end ***************** -->
</beans>
-
下面我们做个简单介绍(简单定时任务上面配置即可实现,下面内容可不用查看):
本文将演示如何通过 Spring 使用 Quartz Scheduler 进行任务调度。Spring 为简化 Quartz 的操作提供了相关支持类。
本文示例使用的相关工具如下:
- Spring 4.2.2 (发布于 2015 年 10 月)
- Quartz Scheduler 2.2.2 (发布于 2015 年 10 月)
- Maven 3
- JDK 1.7
- Eclipse Luna Service Release 1 (4.4.1)
步骤 1:新建 Maven 项目
步骤 2:第三方依赖包的引入
Maven pom.xml 编辑如下:
-
- <dependency>
- <groupId>org.quartz-scheduler</groupId>
- <artifactId>quartz</artifactId>
- <version>${quartz.version}</version>
- </dependency>
步骤 3:Quartz Scheduler 配置作业
有两种方式在 Spring 中使用 Quartz 来配置一个作业。
A:使用 MethodInvokingJobDetailFactoryBean
这种方式在你想要调用特定 bean 的一个方法的时候很是方便,比另一种方法要简单的多。
-
- <bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
- <property name="targetObject" ref="myBean" />
- <property name="targetMethod" value="printMessage" />
- </bean>
以上作业配置简单调用了
myBean
的
printMessage
方法,
myBean
是一个简单的 POJO。
B:使用 JobDetailFactoryBean
如果你需要更高级的设置,需要给作业传递数据,想更加灵活的话就使用这种方式。
-
- <bean name="firstComplexJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
- <property name="jobClass" value="com.defonds.scheduler.jobs.FirstScheduledJob" />
- <property name="jobDataMap">
- <map>
- <entry key="anotherBean" value-ref="anotherBean" />
- </map>
- </property>
- <property name="durability" value="true" />
- </bean>
jobClass
关联到一个继承自
QuartzJobBean
的类,它实现了 Quartz 作业接口。调用到这个作业的时候,它的
executeInternal
将被执行。
jobDataMap
允许我们给相关作业 bean 传递一些数据。在这个例子里,我们将 ScheduledJob 将要使用到的 'anotherBean' 传递给它。
以下是引用 jobclass(
FirstScheduledJob
)的具体实现。
com.defonds.scheduler.jobs.FirstScheduledJob