文档章节

Spring与Quartz实现定期任务

木子丰
 木子丰
发布于 2014/03/28 14:09
字数 1048
阅读 4959
收藏 13

日志说明:
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暂不兼容,实测时启动项目会报错,具体什么错误给忘了)

<!-- 
任务调度测试实现一 :
自定义的任务对象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;

	@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<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);
	}

}


© 著作权归作者所有

木子丰
粉丝 17
博文 236
码字总数 68754
作品 0
郑州
程序员
私信 提问
Spring与Quartz实现定期任务

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

C-Kellen
2015/01/02
0
0
Spring Boot实践--定时任务两种(Schedule与Quartz整合)

Spring Boot实践--定时任务两种(Schedule与Quartz整合) 最近在项目中使用到定时任务,之前一直都是使用Quartz 来实现,最近看Spring 基础发现其实Spring 提供 Spring Schedule 可以帮助我们实...

spinachgit
02/11
0
0
Quartz与Spring的整合使用——创建JobDetail的方式及Trigger

之前说到过Quartz的基本使用(猛戳这里看文章),在实际使用中,我们通常会将定时任务交由spring容器来管理,所以今天我们来说说Quartz与spring的整合。 咱们还是按照Quartz的三大元素的顺序...

哲别0
2017/10/25
0
0
项目ITP(六) spring4.0 整合 Quartz 实现动态任务调度

2014-05-18 12:51 by Jeff Li 前言   系列文章:[传送门]   项目需求:      http://www.cnblogs.com/Alandre/p/3733249.html      上一博客写的是基本调度,后来这只能用于,...

泥沙砖瓦浆木匠
2014/05/18
0
0
项目ITP(五) spring4.0 整合 Quartz 实现任务调度

2014-05-16 22:51 by Jeff Li 前言   系列文章:[传送门]   项目需求:     二维码推送到一体机上,给学生签到扫描用。然后需要的是 上课前20分钟 ,幸好在帮带我的学长做 p2p 的时候...

泥沙砖瓦浆木匠
2014/05/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

月入3万之一个程序员的转行坎坷历程

陈年往事 “我月入3万,怎么会少少了你一个鸡蛋啊?” 这是2017年9月左右的一个新闻,一位煎饼摊大妈因和顾客争执时脱口而出这样一句话而走红。当时还上了各大新闻的头条。 互联网兴起今天,...

苏南-首席填坑官
9分钟前
0
1
OSChina 周一乱弹 —— 眼看着这颗陨石砸了下来

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子:分享Nachtblut的单曲《Antik》 《Antik》- Nachtblut 手机党少年们想听歌,请使劲儿戳(这里) @mr_chip :上海的初雪之后有点冷 ...

小小编辑
35分钟前
69
6
Confluence 6 修改导航显示选项

选择 子页面(Child pages)来在边栏中查看当前页面的子页面。 选择 页面树(Page tree)来查看整个空间的页面树,扩展当前的页面。 你也可以选择是否完全隐藏导航显示选项或者添加你希望可见...

honeymose
今天
2
0
Ubuntu18.04 安装MySQL

1.安装MySQL sudo apt-get install mysql-server 2.配置MySQL sudo mysql_secure_installation 3.设置MySQL非root用户 设置原因:配置过程为系统root权限,在构建MySQL连接时出现错误:ERROR...

AI_SKI
今天
3
0
3.6 rc脚本(start方法) 3.7 rc脚本(stop和status方法) 3.8 rc脚本(以daemon方式启动)

3.6-3.7 rc脚本(start、stop和status方法) #!/usr/bin/env python# -*- coding: utf-8 -*-# [@Version](https://my.oschina.net/u/931210) : python 2.7# [@Time](https://my.oschina.......

隐匿的蚂蚁
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部