Spring+Quartz(一)
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
Quartz是一個非常優(yōu)秀的任務(wù)調(diào)度引擎,詳情請見官網(wǎng):http://www.quartz-scheduler.org/
而Spring很好地集成了Quartz,為企業(yè)級的任務(wù)調(diào)度提供了方便。
?
下面先看一個實(shí)現(xiàn)了Job接口的任務(wù)HelloWorldJob:
Java代碼
package com.springQuartz.example;
import java.util.Map;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class HelloWorldJob implements Job{
?? ?@Override
?? ?public void execute(JobExecutionContext context) throws JobExecutionException {
?? ??? ?
?? ??? ?Map properties = context.getMergedJobDataMap();
?? ??? ?
?? ??? ?System.out.println("Hello World!");
?? ??? ?System.out.println("Previous Fire Time: "+context.getPreviousFireTime());//上次觸發(fā)任務(wù)的時間
?? ??? ?System.out.println("Current Fire Time: "+context.getFireTime());//當(dāng)然觸發(fā)時間
?? ??? ?System.out.println("Next Fire Time: "+context.getNextFireTime());//下次觸發(fā)時間
?? ??? ?
?? ??? ?System.out.println(properties.get("message"));
?? ??? ?System.out.println();
?? ?}
?? ?
}
?
這個Job輸出"HelloWorld",同時輸出上次、本次及下次觸發(fā)的時間。
?
我們看一下在applicationContext.xml中的配置:
Xml代碼
<bean id="job" class="org.springframework.scheduling.quartz.JobDetailBean">
??? <property name="jobClass" value="com.springQuartz.example.HelloWorldJob"/>
?? ?<property name="jobDataAsMap">
?? ????? <map>
?? ???????? <entry key="triggerMessage" value="Job Message In JobDetail"/> <!--設(shè)置JobDetail中的值-->
?? ????? </map>
??? </property>
</bean>
?? ?
<bean id="trigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
??? <property name="jobDetail" ref="job"/> <!--觸發(fā)的job引用-->
??? <property name="startDelay" value="1000"/> <!--設(shè)置延遲1秒后運(yùn)行-->
??? <property name="repeatInterval" value="10000"/> <!--設(shè)置每10秒觸發(fā)一次-->
??? <property name="jobDataAsMap">
?? ?????? <map>
?? ??? ?? <entry key="triggerMessage" value="Job Message From Trigger"/> <!--設(shè)置Trigger中的值-->
?? ?????? </map>
??? </property>
</bean>
<bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
?? ?<property name="triggers">
?? ??? ?<list>
?? ??? ??? ?<ref local="trigger"/>?? ?
?? ??? ?</list>
?? ?</property>
</bean>
?
我們將HelloWorldJob實(shí)現(xiàn)成JobDetailBean類,并配置觸發(fā)器simpleTriggerBean
?
最后我們的測試類:
Java代碼
package com.springQuartz.test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
?? ?public static void main(String args[]){
?? ??? ?BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
?? ?}
}
?
運(yùn)行結(jié)果如下:
運(yùn)行結(jié)果代碼
2011-01-16 20:48:18,437 INFO - Starting Quartz Scheduler now
Hello World!
Previous Fire Time: null
Current Fire Time: Sun Jan 16 20:48:19 CST 2011
Next Fire Time: Sun Jan 16 20:48:29 CST 2011
Job Message From Trigger
Hello World!
Previous Fire Time: Sun Jan 16 20:48:19 CST 2011
Current Fire Time: Sun Jan 16 20:48:29 CST 2011
Next Fire Time: Sun Jan 16 20:48:39 CST 2011
Job Message From Trigger
下面說明幾點(diǎn):
1)首次觸發(fā)是輸出的Previous Fire Time為null
2)jobDataAsMap的說明:在HelloWorldJob.java中g(shù)etMergedJobDataMap是JobDetail和 Trigger上的JobDataMap的合并,兩者數(shù)據(jù)如果沖突,則Trigger上的數(shù)據(jù)將覆蓋JobDetail中的。運(yùn)行結(jié)果也證明了,我們在 Job中設(shè)置的值沒有輸出,而輸出了"Job Message From Trigger"。
3)我們看到HelloWorldJob實(shí)現(xiàn)了Job接口,代碼上依賴了Quartz的接口
?
下面我們討論另外一種更普遍的,去除接口依賴的實(shí)現(xiàn)
?
主要的applicationContext.xml文件的配置
Xml代碼
<bean id="jobService" class="com.springQuartz.service.JobServiceImpl">
</bean>
?? ?
<bean id="invokeJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
?? ?<property name="targetObject">
?? ??? ?<ref bean="jobService" /> <!--目標(biāo)Job-->
?? ?</property>
?? ?<property name="targetMethod">
?? ??? ?<value>JobServiceImpl中的特定方法</value> <!--目標(biāo)方法-->
?? ?</property>
?? ?<property name="concurrent">
?? ??? ?<value>false</value> <!--設(shè)置是否同步-->
?? ?</property>
</bean>
?? ?
<bean id="jobServiceCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
?? ?<property name="jobDetail" ref="invokeJob" />
?? ?<property name="cronExpression" value="5/10 * * * * ?" />
</bean>
<bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
?? ?<property name="triggers">
?? ??? ?<list>
?? ??? ??? ?<ref local="jobServiceCronTrigger"/>
?? ??? ?</list>
?? ?</property>
</bean>
?
?
?
1)首先我們配置具體的Job信息--JobServiceImpl,這個類可以不實(shí)現(xiàn)Quartz中的Job接口
2)最主要的MethodInvokingJobDetailFactoryBean,可以使得1)可行
3)相對于上面的例子,我們使用CronTriggerBean實(shí)現(xiàn)trigger,實(shí)現(xiàn)更靈活的時間配置
4)默認(rèn)情況下,Quartz Jobs是無狀態(tài)的,可能導(dǎo)致jobs之間互相的影響。如果你為相同的JobDetail 指定兩個Trigger, 很可能當(dāng)?shù)谝粋€job完成之前,第二個job就開始了。如果JobDetail 對象實(shí)現(xiàn)了Stateful 接口,就不會發(fā)生這樣的事情。 第二個job將不會在第一個job完成之前開始。為了使得jobs不并發(fā)運(yùn)行,設(shè)置MethodInvokingJobDetailFactoryBean 中的concurrent 標(biāo)記為false 。
?
轉(zhuǎn)載于:https://my.oschina.net/u/2365087/blog/690264
總結(jié)
以上是生活随笔為你收集整理的Spring+Quartz(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS开发中 常用枚举和常用的一些运算符
- 下一篇: JavaScript基础之Number对