Spring与Quartz实现动态更新定时任务

来源:互联网 发布:淘宝店铺托管费用 编辑:程序博客网 时间:2024/06/08 19:03

applicationContext-quartz.xml配置:

<!-- 任务调度测试实现一 :自定义的任务对象com.bocloud.equipment.test.ExampleJob必须继承QuartzJobBean类,实现抽象方法executeInternal每次执行任务时,都会新创建一个任务对象.--><bean id="myJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">    <!--属性jobClass不能通过ref来指定为exampleJob对象,该属性接收的是Class类型的参数进行任务调度时,每次都是一个新的jobClass对象去执行executeInternal方法    -->    <property name="jobClass" value="com.bocloud.equipment.test.ComputerInfoGatherJob" /></bean><bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">    <property name="jobDetail" ref="myJobDetail" />    <property name="cronExpression" value="0/10 * * * * ?" /></bean><bean id="computerInfoGatherScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">    <property name="triggers">        <list>            <ref bean="cronTrigger" />        </list>    </property></bean>
我们只需要专注于QuartzJobBean子类中的executeInternal方法的实现,该方法里只需要放置我们需要定期执行的任务代码即可

<!-- 任务调试实现测试二 :属性targetObject:指定执行任务的对象属性targetMethod:指定执行任务的方法,该方法必须是无参方法--><bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">    <property name="targetObject" ref="computerService" />    <property name="targetMethod" value="list" /></bean> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">    <property name="jobDetail" ref="jobDetail" />    <property name="cronExpression" value="0/10 * * * * ?" /></bean> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">    <property name="triggers">        <list>    <ref bean="cronTrigger" /></list>    </property></bean>


targetObject引用参考的对象,就是Spring框架帮我们生成好的自定义的任务bean对象,不过要注意的是,targetMehthod指定的方法必须是无参的(Spring也支持可以带有参数的任务方法,具体的没注意,以后搞明白了再更新上来,不过一般我们执行定期任务时都不需要动态参数)

package com.bocloud.equipment.test;import java.text.ParseException;import java.util.Date;import org.quartz.CronTrigger;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.quartz.Scheduler;import org.quartz.SchedulerException;import org.quartz.impl.StdScheduler;import org.springframework.scheduling.quartz.QuartzJobBean;import org.springframework.web.context.ContextLoaderListener;import org.springframework.web.context.WebApplicationContext;import com.bocloud.equipment.service.ComputerServiceImpl;public class ComputerInfoGatherJob extends QuartzJobBean {private static long count = 0L;@Overrideprotected void executeInternal(JobExecutionContext context) throws JobExecutionException {System.out.println("*******************************");count++;System.out.println(new Date() + "\t:任务调度开始第" + count + "次");WebApplicationContext webContext = ContextLoaderListener.getCurrentWebApplicationContext();ComputerServiceImpl csi = webContext.getBean(ComputerServiceImpl.class);/* * 更改任务调度的周期时间: * 1,不要调用StdScheduler的shutdown()方法,shutdown()以后无法再start() * 2,可使用standby()暂停调度任务,再start() * 3,设置cron后,要调用rescheduleJob(TriggerKey triggerKey, Trigger newTrigger) *//* * 这里获取SchedulerFactoryBean时,不要通过getBean(Class<T> requiredType) * 或getBean(String name, Class<T> requiredType) * 否则会提示转型错误: * org.quartz.impl.StdScheduler无法转型为指定的需要类型: * org.springframework.scheduling.quartz.SchedulerFactoryBean * 直接使用getBean(String name)再强转为org.quartz.impl.StdScheduler即可 */StdScheduler scheduler = (StdScheduler)webContext.getBean("computerInfoGatherScheduler");if (count == 2) {System.out.println("Computer信息采集任务暂停!");try {//获取此调度器中名称为cronTrigger(配置文件中CronTriggerFactoryBean的名称)的Trigger对象CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger("cronTrigger", Scheduler.DEFAULT_GROUP);System.out.println("设置Computer信息采集任务周期为:5秒");cronTrigger.setCronExpression("0/5 * * * * ?");/* * public Date rescheduleJob(String triggerName, String groupName, Trigger newTrigger) throws SchedulerException * triggerName:要被替换的Trigger的名称 * groupName:要被替换的Trigger的组名 * newTrigger:要新保存的Trigger对象 * 返回:如果没找到triggerName则返回空,否则返回第一次触发任务的时间 */Date date = scheduler.rescheduleJob("cronTrigger", Scheduler.DEFAULT_GROUP, cronTrigger);System.out.println("=========Computer信息采集任务重新开始=========");if (date == null) {throw new RuntimeException("更改任务周期后,重新调度任务失败!!!");}} catch (SchedulerException e) {System.out.println("获取CronTrigger对象时出现异常");e.printStackTrace();} catch (ParseException e) {System.out.println("解析cron表达式时出现异常");e.printStackTrace();}}if (count == 4) {System.out.println("暂停任务调度!!10秒后重新开始");//暂停调度任务:调度器中的所有Trigger对应的任务都会暂停,要暂停指定Trigger的话,调用pauseTrigger()scheduler.standby();try {Thread.sleep(10000);//判断调度器当前是否在暂停状态if (scheduler.isInStandbyMode()) {scheduler.start();}System.out.println("任务调度又重新开始");} catch (InterruptedException e) {e.printStackTrace();} catch (SchedulerException e) {e.printStackTrace();}}csi.list(0, null, null);}}

参考:Spring与Quartz实现定期任务


0 0
原创粉丝点击