文档章节

Spring与Quartz实现定期任务

木子丰
 木子丰
发布于 2014/03/28 14:09
字数 1048
阅读 4857
收藏 13
点赞 0
评论 0

日志说明:
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 Boot--自定义Starter之spring-boot-starter-quartz

痛点 在Spring中使用计划任务,有两种方案可供选择:一、用Spring原生的计划任务,使用起来非常简单,只需要用到@Scheduled注解即可;二、集成Quartz来做计划任务,需要配置大量的Quartz原生...

大大枣 ⋅ 04/03 ⋅ 0

Spring与Quartz实现定期任务

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

C-Kellen ⋅ 2015/01/02 ⋅ 0

SpringMVC框架使用注解执行定时任务

在项目开发过程中,免不了会有一些定时任务。今天就给大家一个SpringMVC框架中利用注解的方式执行定时任务的示例代码 使用到的JAR文件: 点击下列Jar文件会跳到我的网盘下载 aopalliance-1....

Carl_ ⋅ 2015/07/23 ⋅ 0

spring+quartz 定时器使用

项目使用:spring+springMVC+JPA+Maven 1、在pom.xml中引用quartz的jar包 <!-- quartz --><dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version......

杀丶破狼 ⋅ 2015/10/13 ⋅ 1

Spring+Quartz实现定时任务 (二)

在我们进行软件项目开发的过程中,相信大家在很多时候都会遇到如下业务场景:每天、每周或每月生成相应的业务报表;每天统计系统注册人数;定期清理平台长久不登录的用户等等。遇到这种业务场...

yzbty23 ⋅ 2016/04/21 ⋅ 0

ITP项目:一期版本分享

ITP项目:一期版本分享 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 写代码和练书法一样,要坚持。昨晚的提笔留下。 一.项目小结: 项目经...

泥沙砖瓦浆木匠 ⋅ 2014/07/22 ⋅ 0

SpringMvc自动任务调度之task实现项目源码

前提注意:配置文件中如果 default-lazy-init="true",删掉或设置成false,不然注解会失效(这个坑找了好久)。 一、说明 以前项目一直使用Quartz的定时任务,虽然其功能强大,但是配置文件极其...

小柒2012 ⋅ 2016/07/15 ⋅ 0

Spring4+Springmvc+quartz实现多线程动态定时调度

scheduler定时调度系统是大多行业项目都需要的,传统的spring-job模式,个人感觉已经out了,因为存在很多的问题,特别是定时调度的追加、修改、删除等,需要修改xml,xml的配置生效无非是热部...

SpringCloud关注者 ⋅ 2017/11/02 ⋅ 8

解决SpringBoot使用Quartz无法注入Bean的问题

依赖 任务工厂 JobFactory 任务调度器 Scheduler QuartzManager 工具类 *** 举个栗子 自定义任务 Job 管理任务

tianshl ⋅ 05/25 ⋅ 0

分布式定时任务Elastic-Job框架在SpringBoot工程中的应用实践(一)

摘要:如何构建具备作业分片和弹性扩缩容的定时任务系统是每个大型业务系统在设计时需要考虑的重要问题? 对于构建一般的业务系统来说,使用Quartz或者Spring Task即可基本满足我们的单体服用...

癫狂侠 ⋅ 05/12 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 今天 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

eclipse酷炫大法之设置主题、皮肤

eclipse酷炫大法 目前两款不错的eclipse 1.系统设置 Window->Preferences->General->Appearance 2.Eclipse Marketplace下载【推荐】 Help->Eclipse Marketplace->搜索‘theme’进行安装 比如......

anlve ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部