博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring与Quartz实现定期任务
阅读量:6836 次
发布时间:2019-06-26

本文共 4740 字,大约阅读时间需要 15 分钟。

  hot3.png

日志说明:

1、不对Spring的基础环境配置做详细说明;
2、只是记录一下暂时自己从网上及参考手册上查找到的经测试有用的资料
3、记录一下,方便以后自己或需要的朋友使用,后续有新的有用资料会及时更新

4、可查看Spring4.0参考手册:Part Ⅵ.Integration的27.6Using the Quartz Scheduler
5、测试时用的却是Spring3.1.3
注意:引用Quartz时最好使用1.8.5(目前最新的是2.2.1,此版本与Spring3.1.1暂不兼容,实测时启动项目会报错,具体什么错误给忘了)

    
    
 
    
    
 
    
        
            
        
    

我们只需要专注于QuartzJobBean子类中的executeInternal方法的实现,该方法里只需要放置我们需要定期执行的任务代码即可

    
    
      
    
    
      
    
        
        
    
    

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;     @Override    protected 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
 requiredType)         * 或getBean(String name, Class
 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);    } }

转载于:https://my.oschina.net/penfin/blog/363105

你可能感兴趣的文章
saltstack之远程触发文件备份、回滚
查看>>
Struts2教程2:处理一个form多个submit
查看>>
php文件上传的经验分享
查看>>
MySQL SQL优化
查看>>
代码编辑器——sublime
查看>>
MogileFS高级应用(二)最后有疑问
查看>>
mail spy
查看>>
第19课:Spark高级排序彻底解密
查看>>
深入剖析Android系统
查看>>
网络部署原理加实验步骤
查看>>
Google 公司的 Java 语言编写规范
查看>>
linux系统启动级别
查看>>
bash编程-循环控制的结构
查看>>
Java-第三章-使用if选择结构实现,如果年龄够7岁或5岁并且是男,可以搬桌子
查看>>
使用 /proc 文件系统来访问 Linux 内核的内容
查看>>
如何对DB2数据库做性能分析?
查看>>
andriod之log打印
查看>>
Android2.3解析json出错
查看>>
高并发&高可用系统应对策略的一些思考
查看>>
我的友情链接
查看>>