`

Spring4整合quartz2.2.3,quartz动态任务

阅读更多

Spring4整合quartz2.2.3,quartz动态任务

 

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

©Copyright 蕃薯耀 2017年8月25日

http://fanshuyao.iteye.com/

 

可以跳过此篇,直接看总结篇:http://fanshuyao.iteye.com/blog/2392350 

 

 quartz下载

http://www.quartz-scheduler.org/downloads/

 

一、quartz动态任务管理类:

 

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.matchers.GroupMatcher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import cn.imovie.common.utils.CC;
import cn.imovie.common.utils.JasonUtils;
import cn.imovie.common.utils.SpringUtils;
import cn.imovie.entity.task.ScheduleJob;
import cn.imovie.service.ScheduleJobService;

public class SchedulerManage {

	private Logger log = LoggerFactory.getLogger(SchedulerManage.class);
	
	private Scheduler scheduler = (Scheduler) SpringUtils.getBeanById("scheduler");
	
	@Autowired
	private ScheduleJobService scheduleJobService;
	
	/**
	 * 新增任务
	 * @param scheduleJob
	 */
	@SuppressWarnings("unchecked")
	public void addJob(ScheduleJob scheduleJob){
		TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
		try {
			//任务触发
			CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
			if (null == trigger) {
				JobDetail jobDetail = JobBuilder.newJob((Class<? extends Job>) Class.forName(scheduleJob.getClazz()))
			      .withIdentity(scheduleJob.getJobName(), scheduleJob.getJobGroup()).build();
			    jobDetail.getJobDataMap().put("scheduleJob", scheduleJob);
			    
			    CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression());
			    /*withMisfireHandlingInstructionDoNothing
			    ——不触发立即执行
			    ——等待下次Cron触发频率到达时刻开始按照Cron频率依次执行

			    withMisfireHandlingInstructionIgnoreMisfires
			    ——以错过的第一个频率时间立刻开始执行
			    ——重做错过的所有频率周期后
			    ——当下一次触发频率发生时间大于当前时间后,再按照正常的Cron频率依次执行

			    withMisfireHandlingInstructionFireAndProceed
			    ——以当前时间为触发频率立刻触发一次执行
			    ——然后按照Cron频率依次执行*/
			    trigger = TriggerBuilder.newTrigger().withIdentity(scheduleJob.getJobName(), scheduleJob.getJobGroup()).withSchedule(cronScheduleBuilder.withMisfireHandlingInstructionDoNothing()).build();
			    scheduler.scheduleJob(jobDetail, trigger);
			    log.info(CC.LOG_PREFIX + "新增任务:"+JasonUtils.Object2String(scheduleJob));
			}else {
			    // Trigger已存在,那么更新相应的定时设置
			    //表达式调度构建器
			    CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression());
			    //按新的cronExpression表达式重新构建trigger
			    trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder.withMisfireHandlingInstructionDoNothing()).build();
			    //按新的trigger重新设置job执行
			    scheduler.rescheduleJob(triggerKey, trigger);
			    log.info(CC.LOG_PREFIX + "任务"+JasonUtils.Object2String(scheduleJob)+"已经存在,更新trigger");
			}
			//scheduleJobService.save(req, sysUserInSession, scheduleJob);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 暂停任务
	 * @param scheduleJob
	 */
	public void pauseJob(ScheduleJob scheduleJob){
		JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
		try {
			scheduler.pauseJob(jobKey);
			log.info(CC.LOG_PREFIX + "暂停任务:"+JasonUtils.Object2String(scheduleJob));
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 暂停全部任务
	 */
	public void pauseAll(){
		try {
			scheduler.pauseAll();
			log.info(CC.LOG_PREFIX + "暂停所有任务");
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 恢复任务
	 * @param scheduleJob
	 */
	public void resumeJob(ScheduleJob scheduleJob){
		JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
		try {
			scheduler.resumeJob(jobKey);
			log.info(CC.LOG_PREFIX + "恢复任务:"+JasonUtils.Object2String(scheduleJob));
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}
	
	
	/**
	 * 恢复所有任务
	 */
	public void resumeAll(){
		try {
			scheduler.resumeAll();
			log.info(CC.LOG_PREFIX + "恢复所有任务");
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 删除任务后,所对应的trigger也将被删除
	 * @param scheduleJob
	 */
	public void deleteJob(ScheduleJob scheduleJob){
		JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
		try {
			scheduler.pauseJob(jobKey);//先暂停任务
			scheduler.deleteJob(jobKey);//再删除任务
			log.info(CC.LOG_PREFIX + "删除任务:"+JasonUtils.Object2String(scheduleJob));
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 立即运行任务
	 * @param scheduleJob
	 */
	public void triggerJob(ScheduleJob scheduleJob){
		JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
		try {
			scheduler.triggerJob(jobKey);
			log.info(CC.LOG_PREFIX + "运行任务:"+JasonUtils.Object2String(scheduleJob));
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 更新任务的时间表达式
	 * @param scheduleJob
	 */
	public void updateJob(ScheduleJob scheduleJob){
		try {
			TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());

			//获取trigger,即在spring配置文件中定义的 bean id="myTrigger"
			CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);

			//表达式调度构建器
			CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression());

			//按新的cronExpression表达式重新构建trigger
			trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder.withMisfireHandlingInstructionDoNothing()).build();
			//按新的trigger重新设置job执行
			scheduler.rescheduleJob(triggerKey, trigger);
			log.info(CC.LOG_PREFIX + "更新任务:"+JasonUtils.Object2String(scheduleJob));
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}
	
	
	/**
	 * 获取quartz调度器的计划任务
	 * @return
	 */
	public List<ScheduleJob> getScheduleJobList(){
		List<ScheduleJob> jobList = null;
		try {
			GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
			Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
			jobList = new ArrayList<ScheduleJob>();
			for (JobKey jobKey : jobKeys) {
				List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
				for (Trigger trigger : triggers) {
					ScheduleJob job = new ScheduleJob();
					job.setJobName(jobKey.getName());
					job.setJobGroup(jobKey.getGroup());
					job.setClazz(jobKey.getClass().toString());
					job.setJobDesc("触发器:" + trigger.getKey());
					Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
					job.setJobStatus(triggerState.name());
					if (trigger instanceof CronTrigger) {
						CronTrigger cronTrigger = (CronTrigger) trigger;
						String cronExpression = cronTrigger.getCronExpression();
						job.setCronExpression(cronExpression);
					}
					jobList.add(job);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return jobList;
	}
	
	/**
	 * 获取quartz调度器的运行任务
	 * @return
	 */
	public List<ScheduleJob> getScheduleJobRunningList(){
		List<ScheduleJob> jobList = null;
		try {
			List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs();
			jobList = new ArrayList<ScheduleJob>(executingJobs.size());
			for (JobExecutionContext executingJob : executingJobs) {
			  ScheduleJob job = new ScheduleJob();
			  JobDetail jobDetail = executingJob.getJobDetail();
			  JobKey jobKey = jobDetail.getKey();
			  Trigger trigger = executingJob.getTrigger();
			  job.setJobName(jobKey.getName());
			  job.setJobGroup(jobKey.getGroup());
			  job.setClazz(jobKey.getClass().toString());
			  job.setJobDesc("触发器:" + trigger.getKey());
			  Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
			  job.setJobStatus(triggerState.name());
			  if (trigger instanceof CronTrigger) {
			    CronTrigger cronTrigger = (CronTrigger) trigger;
			    String cronExpression = cronTrigger.getCronExpression();
			    job.setCronExpression(cronExpression);
			  }
			  jobList.add(job);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return jobList;
	}

	public Scheduler getScheduler() {
		return scheduler;
	}

	public void setScheduler(Scheduler scheduler) {
		this.scheduler = scheduler;
	}

	
	
}

 注意事项:

1、SchedulerFactoryBean 在spring.xml配置了,但不能直接注入,就算加上@Component注解也不行,所以使用SpringUtils 工具类获取。

<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  

 

2、获取到的SchedulerFactoryBean 并不是SchedulerFactoryBean,而是scheduler

private Scheduler scheduler = (Scheduler) SpringUtils.getBeanById("scheduler");

 

 

 

二、ScheduleJob 类:可以保存计划任务的信息,也可以做为实体参数

public class ScheduleJob implements Serializable{
	
	private Long scheduleJobId;
	
	/** 任务名称 */
	private String jobName;
	
	/** 任务分组 */
	private String jobGroup;
	
	/** 定时任务对应的类(包括包路径),如:cn.imovie.manage.task.job.TicketMoneyLessThanNormalWarn */
	private String clazz;
	
	/** 任务状态:1禁用 2启用 3删除*/
	private String jobStatus;
	
	/** 任务运行时间表达式 */
	private String cronExpression;
	
	/** 任务描述 */
	private String jobDesc;
	
	private Long createMan;
    private Date createTime;
    private Long updateMan;
    private Date updateTime;
    
    // 非持久化属性
    private String createManText;
    private String updateManText;

    
	public Long getScheduleJobId() {
		return scheduleJobId;
	}

	public void setScheduleJobId(Long scheduleJobId) {
		this.scheduleJobId = scheduleJobId;
	}

	public String getJobName() {
		return jobName;
	}

	public void setJobName(String jobName) {
		this.jobName = jobName;
	}

	public String getJobGroup() {
		return jobGroup;
	}

	public void setJobGroup(String jobGroup) {
		this.jobGroup = jobGroup;
	}

	public String getClazz() {
		return clazz;
	}

	public void setClazz(String clazz) {
		this.clazz = clazz;
	}

	public String getJobStatus() {
		return jobStatus;
	}

	public void setJobStatus(String jobStatus) {
		this.jobStatus = jobStatus;
	}

	public String getCronExpression() {
		return cronExpression;
	}

	public void setCronExpression(String cronExpression) {
		this.cronExpression = cronExpression;
	}

	public String getJobDesc() {
		return jobDesc;
	}

	public void setJobDesc(String jobDesc) {
		this.jobDesc = jobDesc;
	}

	public Long getCreateMan() {
		return createMan;
	}

	public void setCreateMan(Long createMan) {
		this.createMan = createMan;
	}

	public Date getCreateTime() {
		return createTime;
	}

	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}

	public Long getUpdateMan() {
		return updateMan;
	}

	public void setUpdateMan(Long updateMan) {
		this.updateMan = updateMan;
	}

	public Date getUpdateTime() {
		return updateTime;
	}

	public void setUpdateTime(Date updateTime) {
		this.updateTime = updateTime;
	}

	@Transient
	public String getCreateManText() {
		return createManText;
	}

	public void setCreateManText(String createManText) {
		this.createManText = createManText;
	}

	@Transient
	public String getUpdateManText() {
		return updateManText;
	}

	public void setUpdateManText(String updateManText) {
		this.updateManText = updateManText;
	}

	
	
}

 

三、Spring.xml 文件配置

<!-- 定时任务配置 start -->
    <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
        <property name="dataSource" ref="dataSource"></property>    
        <!--可选,QuartzScheduler 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了 -->      
        <property name="overwriteExistingJobs" value="true" />      
         <!--必须的,QuartzScheduler 延时启动,应用启动完后 QuartzScheduler 再启动 -->    
        <property name="startupDelay" value="10" />    
        <!-- 设置自动启动 -->    
        <property name="autoStartup" value="true" />  
        <property name="applicationContextSchedulerContextKey" value="applicationContextKey" />
        <property name="configLocation" value="classpath:spring-quartz.properties" />      
    </bean>
    
    <bean id="schedulerManage" class="cn.imovie.manage.task.SchedulerManage"></bean>
    <!-- 定时任务配置 end -->

 

四、spring-quartz.properties 文件配置:

#配置见:http://www.quartz-scheduler.org/documentation/quartz-2.2.x/configuration/ConfigJDBCJobStoreClustering.html
#============================================================================
# Configure Main Scheduler Properties  
#============================================================================

org.quartz.scheduler.instanceName = MyClusteredScheduler
org.quartz.scheduler.instanceId = AUTO

#============================================================================
# Configure ThreadPool  
#============================================================================

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 25
org.quartz.threadPool.threadPriority = 5

#============================================================================
# Configure JobStore  
#============================================================================

org.quartz.jobStore.misfireThreshold = 60000

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties = false
org.quartz.jobStore.dataSource = myDS
org.quartz.jobStore.tablePrefix = QRTZ_

org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval = 20000

 

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

©Copyright 蕃薯耀 2017年8月25日

http://fanshuyao.iteye.com/

1
0
分享到:
评论
3 楼 蕃薯耀 2017-08-25  
go372900589 写道
点击下载链接下载后的文件是一个gz文件,用7z解压2遍,我才发现是quartz的源码,我还以为是你项目的代码


这是quartz-2.2.3的包,= =
2 楼 go372900589 2017-08-25  
点击下载链接下载后的文件是一个gz文件,用7z解压2遍,我才发现是quartz的源码,我还以为是你项目的代码
1 楼 蕃薯耀 2017-08-25  
Spring4整合quartz2.2.3,quartz动态任务

>>>>>>>>
蕃薯耀

相关推荐

    Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置

    Spring整合Quartz 2.2.3是Java开发者在实现定时任务时常用的一种技术组合。Quartz是一款开源的作业调度框架,它允许程序在特定时间执行预定的任务,而Spring则是一个强大的企业级应用开发框架,提供了丰富的依赖注入...

    spring4.0.6+quartz 2.2.3 集群示例

    总之,结合Spring 4.0.6和Quartz 2.2.3构建集群示例,能够帮助你在大型分布式系统中实现灵活、可靠的定时任务调度。通过熟练掌握这一技术,你可以为企业的后台服务提供强大而稳定的定时任务处理能力。

    Quartz2.2.3+Spring4.3.14整合demo

    在 "Quartz2.2.3+Spring4.3.14整合demo" 项目中,我们看到的是一个示例,展示了如何在 Eclipse 开发环境中将这两个库结合使用。Eclipse 是一个流行的 Java IDE,它提供了丰富的功能来支持开发过程。 首先,`....

    spring3整合quartz1.8和spring3整合quartz2.2两个版本示例

    本示例将探讨如何将 Spring 3 与 Quartz 1.8 和 2.2 版本进行整合,以实现高效的任务调度。 首先,我们来看 Spring 3 整合 Quartz 1.8 的步骤: 1. **引入依赖**:在项目中添加 Quartz 和 Spring 相关的库,确保...

    SpringBoot整合quartz2.2.3自定义数据源和websocket通信

    综上所述,SpringBoot整合quartz 2.2.3和WebSocket通信是一项综合性的任务,涉及到数据库管理、定时任务调度和实时通信等多个领域。通过恰当的配置和编程,我们可以构建出高效、可扩展的微服务系统,满足复杂的企业...

    spring boot+vue+quartz2.2.3整合定时调度系统

    spring boot+vue+quartz2.2.3整合定时调度系统持久化道mysql,sql脚本在项目里面。sql文件spring boot+vue+quartz2.2.3整合定时调度系统持久化道mysql

    quartz-2.2.3版本的quartz初始化sql语句

    总之,Quartz 2.2.3的初始化SQL语句是搭建Quartz任务调度系统的重要环节,它们构建了存储任务调度数据的基础架构,使得Quartz能有效地管理、执行和监控定时任务。正确理解和使用这些SQL语句,有助于确保Quartz在各种...

    quartz-2.2.3-sql.zip

    总的来说,"quartz-2.2.3-sql.zip"文件为开发者提供了在各种常见数据库上快速启动和配置Quartz的工具,使得任务调度的实现更加便捷和高效。无论是小型项目还是大型企业级应用,Quartz都能作为强大的定时任务管理工具...

    Spring Boot 2.0.1 整合 Quartz 2.2.3 调度中心实例,含功能效果及使用注意事项.zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用...

    spring-context-support-4.2.2和quartz-2.2.3所需Jar包

    标题中的"spring-context-support-4.2.2和quartz-2.2.3所需Jar包"涉及到两个关键的Java库:Spring Context Support 4.2.2版本和Quartz Scheduler 2.2.3版本。这两个库在企业级Java应用开发中扮演着重要角色,特别是...

    quartz-2.2.3所需Jar包和spring-webmvc-4.2.6所有jar

    4. **Spring Context Support**:学习如何使用Spring提供的支持类来集成邮件服务、消息队列(JMS)以及定时任务(如Quartz)。 5. **Spring Framework版本管理**:理解不同版本之间的差异,如新特性、改进和兼容性...

    quartz-2.2.3

    - 易于整合:Quartz可以轻松与Spring等框架集成,简化应用的配置和管理。 - 多种持久化方式:除了默认的JDBC存储,Quartz还可以与JPA、Hibernate等ORM框架配合,使用其他持久化机制。 四、数据库表结构 Quartz的...

    springbatch_嵌入式jetty_动态控制的quartz

    支持web接口的批处理框架 ...springmvc4.0.7 springbatch3.0.7 quartz2.2.3 mysql5.6 oracle11g junit4.11 log4j1.2.17 mybatis3.4.1 druid1.0.17 smg3(决策引擎) jetty8.1.5 fastjson1.2.7 springjdbc3.2.14

    ssm框架+quartz2.2Jar包

    4. **启动Scheduler**:在Spring的初始化方法中启动Quartz Scheduler,使其开始监控并执行任务。 5. **使用Quartz API**:在需要的地方,如Service层,可以调用Quartz提供的API来触发或修改任务。 SSM框架结合...

    Spring quartz Job依赖注入使用详解

    主要介绍了Spring quartz Job依赖注入使用详解的相关资料,Spring quartz Job不能依赖注入,Spring整合quartz Job任务不能注入Spring4整合quartz2.2.3中Job任务使用@Autowired不能注入,需要的朋友可以参考下

    spring整合Quartz框架过程详解

    Spring 整合 Quartz 框架过程详解 本文主要介绍了 Spring 整合 Quartz 框架的过程详解,通过示例代码对大家的学习或者工作具有参考学习价值。 一、Quartz 框架简介 Quartz 是一个完全由 Java 编写的开源任务调度...

    Java项目:(小程序)物业管理系统(spring+spring mvc+mybatis+layui+微信小程)

    一、项目简述 本系统功能包括: 微信小程序物业管理系统,微信朝胞括以下几个模 块: 社区公告、报修、信息采集、生活缴费、二手置换 微信小程序后台管理界面可以...项目技术: spring+spring mvc+mybatis+layui等等。

    ssm(spring+spring mvc+mybatis)高仿小米电子商城项目实例

    任务调度:Spring + Quartz 2.2.3 持久层框架:MyBatis 3.4.2 + Mybatis-plus 2.0.1 日志管理:SLF4J 1.7 + Log4j2 2.7 工具类:Apache Commons、Jackson 2.2、fastjson 1.2.20 前端技术 JS框架:Jquery 表格插件:...

    ssm(spring+spring mvc+mybatis)电子商城项目

    任务调度:Spring + Quartz 2.2.3 持久层框架:MyBatis 3.4.2 + Mybatis-plus 2.0.1 日志管理:SLF4J 1.7 + Log4j2 2.7 工具类:Apache Commons、Jackson 2.2、fastjson 1.2.20 前端技术 JS框架:Jquery 表格插件:...

    spring定时器所需jar包

    在标题提到的"spring定时器所需jar包"中,主要涉及的是Spring对定时任务的支持以及与之相关的第三方库Quartz。 首先,Spring框架自身提供了`@Scheduled`注解和`TaskScheduler`接口,用于实现简单的定时任务。`@...

Global site tag (gtag.js) - Google Analytics