Java Spring中Quartz调度器详解及实例
一、Quartz的特点
*按作业类的继承方式来分,主要有以下两种:
1.作业类继承org.springframework.scheduling.quartz.QuartzJobBean类的方式
2.作业类不继承org.springframework.scheduling.quartz.QuartzJobBean类的方式
注:个人比较推崇第二种,因为这种方式下的作业类仍然是POJO。
*按任务调度的触发时机来分,主要有以下两种:
1.每隔指定时间则触发一次,对应的调度器为org.springframework.scheduling.quartz.SimpleTriggerBean
2.每到指定时间则触发一次,对应的调度器为org.springframework.scheduling.quartz.CronTriggerBean
注:这两种触发方式均可以跟两种作业继承方式相互组合来使用。
下面简单演示一下在spring对Quartz的用法。
二、作业类继承org.springframework.scheduling.quartz.QuartzJobBean类,每到指定时间则触发一次
1.编写作业类
packagebean.jobDetailBean; importorg.quartz.JobExecutionContext; importorg.quartz.JobExecutionException; importorg.springframework.scheduling.quartz.QuartzJobBean; publicclassJob1extendsQuartzJobBean{ privateinttimeout; privatestaticinti=0; //调度工厂实例化后,经过timeout时间开始执行调度 publicvoidsetTimeout(inttimeout){ this.timeout=timeout; } /** *要调度的具体任务 */ @Override protectedvoidexecuteInternal(JobExecutionContextcontext) throwsJobExecutionException{ System.out.println("继承QuartzJobBean的方式-调度"+++i+"进行中..."); } }
2.配置作业类
<!--作业使用继承QuartzJobBean的方式--> <beanname="job1"class="org.springframework.scheduling.quartz.JobDetailBean"> <propertyname="jobClass"value="bean.jobDetailBean.Job1"/> <propertyname="jobDataAsMap"> <map> <entrykey="timeout"value="0"/> </map> </property> </bean>
3.配置作业调度的触发方式
<!--对应于作业继QuartzJobBean类的方式--> <beanid="cronTrigger"class="org.springframework.scheduling.quartz.CronTriggerBean"> <propertyname="jobDetail"ref="job1"/> <!-- "cronExpression"的配置说明 字段允许值允许的特殊字符 秒0-59,-*/ 分0-59,-*/ 小时0-23,-*/ 日期1-31,-*?/LWC 月份1-12或者JAN-DEC,-*/ 星期1-7或者SUN-SAT,-*?/LC# 年(可选)留空,1970-2099,-*/ -区间 *通配符 ?你不想设置那个字段 --> <!--每分钟的第0,10,20,30,40,50秒调度一次--> <propertyname="cronExpression"value="0,10,20,30,40,50****?"/> </bean>
4.配置调度工厂
<beanclass="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <propertyname="triggers"> <list> <refbean="cronTrigger"/> </list> </property> </bean>
5.开启调度
packagetest; importorg.springframework.beans.factory.BeanFactory; importorg.springframework.context.support.ClassPathXmlApplicationContext; publicclassScheduleTest{ publicstaticvoidmain(String[]args){ <spanstyle="white-space:pre"></span>BeanFactoryfactory=newClassPathXmlApplicationContext("applicationContext*.xml"); } }
三、作业类不继承org.springframework.scheduling.quartz.QuartzJobBean类,每隔指定时间则触发一次
1.编写作业类
packagebean.jobDetailBean; publicclassJob2{ privatestaticinti=0; publicvoiddoJob2(){ System.out.println("不继承QuartzJobBean方式-调度"+++i+"进行中..."); } }
2.配置作业类
<beanid="job2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <propertyname="targetObject"> <beanclass="bean.jobDetailBean.Job2"/> </property> <propertyname="targetMethod"value="doJob2"/> <propertyname="concurrent"value="false"/><!--作业不并发调度--> </bean>
3.配置作业调度的触发方式
<beanid="simpleTrigger"class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <propertyname="jobDetail"ref="job2"/> <propertyname="startDelay"value="0"/><!--调度工厂实例化后,经过0秒开始执行调度--> <propertyname="repeatInterval"value="2000"/><!--每2秒调度一次--> </bean>
4.配置调度工厂
<beanclass="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <propertyname="triggers"> <list> <refbean="simpleTrigger"/> </list> </property> </bean>
5.开启调度
packagetest; importorg.springframework.beans.factory.BeanFactory; importorg.springframework.context.support.ClassPathXmlApplicationContext; publicclassScheduleTest{ publicstaticvoidmain(String[]args){ BeanFactoryfactory=newClassPathXmlApplicationContext("applicationContext*.xml"); } }
简单说明spring自带调度器的例子。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!