Java Spring中Quartz調(diào)度器詳解及實(shí)例
一、Quartz的特點(diǎn)
* 按作業(yè)類的繼承方式來分,主要有以下兩種:
1.作業(yè)類繼承org.springframework.scheduling.quartz.QuartzJobBean類的方式
2.作業(yè)類不繼承org.springframework.scheduling.quartz.QuartzJobBean類的方式
注:個(gè)人比較推崇第二種,因?yàn)檫@種方式下的作業(yè)類仍然是POJO。
* 按任務(wù)調(diào)度的觸發(fā)時(shí)機(jī)來分,主要有以下兩種:
1.每隔指定時(shí)間則觸發(fā)一次,對(duì)應(yīng)的調(diào)度器為org.springframework.scheduling.quartz.SimpleTriggerBean
2.每到指定時(shí)間則觸發(fā)一次,對(duì)應(yīng)的調(diào)度器為org.springframework.scheduling.quartz.CronTriggerBean
注:這兩種觸發(fā)方式均可以跟兩種作業(yè)繼承方式相互組合來使用。
下面簡(jiǎn)單演示一下在spring對(duì)Quartz的用法。
二、作業(yè)類繼承org.springframework.scheduling.quartz.QuartzJobBean類,每到指定時(shí)間則觸發(fā)一次
1.編寫作業(yè)類
package bean.jobDetailBean; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; public class Job1 extends QuartzJobBean { private int timeout; private static int i = 0; //調(diào)度工廠實(shí)例化后,經(jīng)過timeout時(shí)間開始執(zhí)行調(diào)度 public void setTimeout(int timeout) { this.timeout = timeout; } /** * 要調(diào)度的具體任務(wù) */ @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { System.out.println("繼承QuartzJobBean的方式-調(diào)度" + ++i + "進(jìn)行中..."); } }
2.配置作業(yè)類
<!-- 作業(yè)使用繼承QuartzJobBean的方式 --> <bean name="job1" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value="bean.jobDetailBean.Job1" /> <property name="jobDataAsMap"> <map> <entry key="timeout" value="0" /> </map> </property> </bean>
3.配置作業(yè)調(diào)度的觸發(fā)方式
<!-- 對(duì)應(yīng)于作業(yè)繼QuartzJobBean類的方式 --> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="job1" /> <!-- "cronExpression"的配置說明 字段 允許值 允許的特殊字符 秒 0-59 , - * / 分 0-59 , - * / 小時(shí) 0-23 , - * / 日期 1-31 , - * ? / L W C 月份 1-12 或者 JAN-DEC , - * / 星期 1-7 或者 SUN-SAT , - * ? / L C # 年(可選) 留空, 1970-2099 , - * / - 區(qū)間 * 通配符 ? 你不想設(shè)置那個(gè)字段 --> <!-- 每分鐘的第0,10,20,30,40,50秒調(diào)度一次 --> <property name="cronExpression" value="0,10,20,30,40,50 * * * * ?" /> </bean>
4.配置調(diào)度工廠
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger" /> </list> </property> </bean>
5.開啟調(diào)度
package test; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; public class ScheduleTest { public static void main(String[] args){ <span style="white-space:pre"> </span>BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext*.xml"); } }
三、作業(yè)類不繼承org.springframework.scheduling.quartz.QuartzJobBean類,每隔指定時(shí)間則觸發(fā)一次
1.編寫作業(yè)類
package bean.jobDetailBean; public class Job2 { private static int i = 0; public void doJob2() { System.out.println("不繼承QuartzJobBean方式-調(diào)度" + ++i + "進(jìn)行中..."); } }
2.配置作業(yè)類
<bean id="job2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <bean class="bean.jobDetailBean.Job2" /> </property> <property name="targetMethod" value="doJob2" /> <property name="concurrent" value="false" /><!-- 作業(yè)不并發(fā)調(diào)度 --> </bean>
3.配置作業(yè)調(diào)度的觸發(fā)方式
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail" ref="job2" /> <property name="startDelay" value="0" /><!-- 調(diào)度工廠實(shí)例化后,經(jīng)過0秒開始執(zhí)行調(diào)度 --> <property name="repeatInterval" value="2000" /><!-- 每2秒調(diào)度一次 --> </bean>
4.配置調(diào)度工廠
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="simpleTrigger" /> </list> </property> </bean>
5.開啟調(diào)度
package test; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; public class ScheduleTest { public static void main(String[] args){ BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext*.xml"); } }
簡(jiǎn)單說明spring自帶調(diào)度器的例子。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
深入淺析Spring 的aop實(shí)現(xiàn)原理
AOP(Aspect-OrientedProgramming,面向方面編程),可以說是OOP(Object-Oriented Programing,面向?qū)ο缶幊蹋┑难a(bǔ)充和完善。本文給大家介紹Spring 的aop實(shí)現(xiàn)原理,感興趣的朋友一起學(xué)習(xí)吧2016-03-03Apache DolphinScheduler實(shí)現(xiàn)自動(dòng)化打包單機(jī)/集群部署詳解
這篇文章主要為大家介紹了Apache DolphinScheduler實(shí)現(xiàn)自動(dòng)化打包單機(jī)/集群部署詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09Java避免UTF-8的csv文件打開中文出現(xiàn)亂碼的方法
這篇文章主要介紹了Java避免UTF-8的csv文件打開中文出現(xiàn)亂碼的方法,結(jié)合實(shí)例形式分析了java操作csv文件時(shí)使用utf-16le編碼與utf8編碼相關(guān)操作技巧,需要的朋友可以參考下2019-07-07Java?超詳細(xì)講解Spring?MVC異常處理機(jī)制
Spring?MVC中提供了一個(gè)通用的異常處理機(jī)制,它提供了一個(gè)成熟、簡(jiǎn)潔并且清晰的異常處理方案。當(dāng)使用Spring?MVC開發(fā)Web應(yīng)用時(shí),利用這套現(xiàn)成的機(jī)制進(jìn)行異常處理也更加自然并且高效2022-04-04Springboot?application.yml配置文件拆分方式
這篇文章主要介紹了Springboot?application.yml配置文件拆分方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05