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

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

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

?Copyright 蕃薯耀 2017年9月6日

http://www.cnblogs.com/fanshuyao/

可以直接看总结篇: http://www.cnblogs.com/fanshuyao/p/7484843.html

 quartz下载

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

一、quartz动态任务管理类:

Java代码  

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.Set;
  4. import org.quartz.CronScheduleBuilder;
  5. import org.quartz.CronTrigger;
  6. import org.quartz.Job;
  7. import org.quartz.JobBuilder;
  8. import org.quartz.JobDetail;
  9. import org.quartz.JobExecutionContext;
  10. import org.quartz.JobKey;
  11. import org.quartz.Scheduler;
  12. import org.quartz.SchedulerException;
  13. import org.quartz.Trigger;
  14. import org.quartz.TriggerBuilder;
  15. import org.quartz.TriggerKey;
  16. import org.quartz.impl.matchers.GroupMatcher;
  17. import org.slf4j.Logger;
  18. import org.slf4j.LoggerFactory;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import cn.imovie.common.utils.CC;
  21. import cn.imovie.common.utils.JasonUtils;
  22. import cn.imovie.common.utils.SpringUtils;
  23. import cn.imovie.entity.task.ScheduleJob;
  24. import cn.imovie.service.ScheduleJobService;
  25. public class SchedulerManage {
  26. private Logger log = LoggerFactory.getLogger(SchedulerManage.class);
  27. private Scheduler scheduler = (Scheduler) SpringUtils.getBeanById("scheduler");
  28. @Autowired
  29. private ScheduleJobService scheduleJobService;
  30. /**
  31. * 新增任务
  32. * @param scheduleJob
  33. */
  34. @SuppressWarnings("unchecked")
  35. public void addJob(ScheduleJob scheduleJob){
  36. TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
  37. try {
  38. //任务触发
  39. CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
  40. if (null == trigger) {
  41. JobDetail jobDetail = JobBuilder.newJob((Class<? extends Job>) Class.forName(scheduleJob.getClazz()))
  42. .withIdentity(scheduleJob.getJobName(), scheduleJob.getJobGroup()).build();
  43. jobDetail.getJobDataMap().put("scheduleJob", scheduleJob);
  44. CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression());
  45. /*withMisfireHandlingInstructionDoNothing
  46. ——不触发立即执行
  47. ——等待下次Cron触发频率到达时刻开始按照Cron频率依次执行
  48. withMisfireHandlingInstructionIgnoreMisfires
  49. ——以错过的第一个频率时间立刻开始执行
  50. ——重做错过的所有频率周期后
  51. ——当下一次触发频率发生时间大于当前时间后,再按照正常的Cron频率依次执行
  52. withMisfireHandlingInstructionFireAndProceed
  53. ——以当前时间为触发频率立刻触发一次执行
  54. ——然后按照Cron频率依次执行*/
  55. trigger = TriggerBuilder.newTrigger().withIdentity(scheduleJob.getJobName(), scheduleJob.getJobGroup()).withSchedule(cronScheduleBuilder.withMisfireHandlingInstructionDoNothing()).build();
  56. scheduler.scheduleJob(jobDetail, trigger);
  57. log.info(CC.LOG_PREFIX + "新增任务:"+JasonUtils.Object2String(scheduleJob));
  58. }else {
  59. // Trigger已存在,那么更新相应的定时设置
  60. //表达式调度构建器
  61. CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression());
  62. //按新的cronExpression表达式重新构建trigger
  63. trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder.withMisfireHandlingInstructionDoNothing()).build();
  64. //按新的trigger重新设置job执行
  65. scheduler.rescheduleJob(triggerKey, trigger);
  66. log.info(CC.LOG_PREFIX + "任务"+JasonUtils.Object2String(scheduleJob)+"已经存在,更新trigger");
  67. }
  68. //scheduleJobService.save(req, sysUserInSession, scheduleJob);
  69. } catch (Exception e) {
  70. e.printStackTrace();
  71. }
  72. }
  73. /**
  74. * 暂停任务
  75. * @param scheduleJob
  76. */
  77. public void pauseJob(ScheduleJob scheduleJob){
  78. JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
  79. try {
  80. scheduler.pauseJob(jobKey);
  81. log.info(CC.LOG_PREFIX + "暂停任务:"+JasonUtils.Object2String(scheduleJob));
  82. } catch (SchedulerException e) {
  83. e.printStackTrace();
  84. }
  85. }
  86. /**
  87. * 暂停全部任务
  88. */
  89. public void pauseAll(){
  90. try {
  91. scheduler.pauseAll();
  92. log.info(CC.LOG_PREFIX + "暂停所有任务");
  93. } catch (SchedulerException e) {
  94. e.printStackTrace();
  95. }
  96. }
  97. /**
  98. * 恢复任务
  99. * @param scheduleJob
  100. */
  101. public void resumeJob(ScheduleJob scheduleJob){
  102. JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
  103. try {
  104. scheduler.resumeJob(jobKey);
  105. log.info(CC.LOG_PREFIX + "恢复任务:"+JasonUtils.Object2String(scheduleJob));
  106. } catch (SchedulerException e) {
  107. e.printStackTrace();
  108. }
  109. }
  110. /**
  111. * 恢复所有任务
  112. */
  113. public void resumeAll(){
  114. try {
  115. scheduler.resumeAll();
  116. log.info(CC.LOG_PREFIX + "恢复所有任务");
  117. } catch (SchedulerException e) {
  118. e.printStackTrace();
  119. }
  120. }
  121. /**
  122. * 删除任务后,所对应的trigger也将被删除
  123. * @param scheduleJob
  124. */
  125. public void deleteJob(ScheduleJob scheduleJob){
  126. JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
  127. try {
  128. scheduler.pauseJob(jobKey);//先暂停任务
  129. scheduler.deleteJob(jobKey);//再删除任务
  130. log.info(CC.LOG_PREFIX + "删除任务:"+JasonUtils.Object2String(scheduleJob));
  131. } catch (SchedulerException e) {
  132. e.printStackTrace();
  133. }
  134. }
  135. /**
  136. * 立即运行任务
  137. * @param scheduleJob
  138. */
  139. public void triggerJob(ScheduleJob scheduleJob){
  140. JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
  141. try {
  142. scheduler.triggerJob(jobKey);
  143. log.info(CC.LOG_PREFIX + "运行任务:"+JasonUtils.Object2String(scheduleJob));
  144. } catch (SchedulerException e) {
  145. e.printStackTrace();
  146. }
  147. }
  148. /**
  149. * 更新任务的时间表达式
  150. * @param scheduleJob
  151. */
  152. public void updateJob(ScheduleJob scheduleJob){
  153. try {
  154. TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
  155. //获取trigger,即在spring配置文件中定义的 bean id="myTrigger"
  156. CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
  157. //表达式调度构建器
  158. CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression());
  159. //按新的cronExpression表达式重新构建trigger
  160. trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder.withMisfireHandlingInstructionDoNothing()).build();
  161. //按新的trigger重新设置job执行
  162. scheduler.rescheduleJob(triggerKey, trigger);
  163. log.info(CC.LOG_PREFIX + "更新任务:"+JasonUtils.Object2String(scheduleJob));
  164. } catch (SchedulerException e) {
  165. e.printStackTrace();
  166. }
  167. }
  168. /**
  169. * 获取quartz调度器的计划任务
  170. * @return
  171. */
  172. public List<ScheduleJob> getScheduleJobList(){
  173. List<ScheduleJob> jobList = null;
  174. try {
  175. GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
  176. Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
  177. jobList = new ArrayList<ScheduleJob>();
  178. for (JobKey jobKey : jobKeys) {
  179. List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
  180. for (Trigger trigger : triggers) {
  181. ScheduleJob job = new ScheduleJob();
  182. job.setJobName(jobKey.getName());
  183. job.setJobGroup(jobKey.getGroup());
  184. job.setClazz(jobKey.getClass().toString());
  185. job.setJobDesc("触发器:" + trigger.getKey());
  186. Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
  187. job.setJobStatus(triggerState.name());
  188. if (trigger instanceof CronTrigger) {
  189. CronTrigger cronTrigger = (CronTrigger) trigger;
  190. String cronExpression = cronTrigger.getCronExpression();
  191. job.setCronExpression(cronExpression);
  192. }
  193. jobList.add(job);
  194. }
  195. }
  196. } catch (Exception e) {
  197. e.printStackTrace();
  198. }
  199. return jobList;
  200. }
  201. /**
  202. * 获取quartz调度器的运行任务
  203. * @return
  204. */
  205. public List<ScheduleJob> getScheduleJobRunningList(){
  206. List<ScheduleJob> jobList = null;
  207. try {
  208. List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs();
  209. jobList = new ArrayList<ScheduleJob>(executingJobs.size());
  210. for (JobExecutionContext executingJob : executingJobs) {
  211. ScheduleJob job = new ScheduleJob();
  212. JobDetail jobDetail = executingJob.getJobDetail();
  213. JobKey jobKey = jobDetail.getKey();
  214. Trigger trigger = executingJob.getTrigger();
  215. job.setJobName(jobKey.getName());
  216. job.setJobGroup(jobKey.getGroup());
  217. job.setClazz(jobKey.getClass().toString());
  218. job.setJobDesc("触发器:" + trigger.getKey());
  219. Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
  220. job.setJobStatus(triggerState.name());
  221. if (trigger instanceof CronTrigger) {
  222. CronTrigger cronTrigger = (CronTrigger) trigger;
  223. String cronExpression = cronTrigger.getCronExpression();
  224. job.setCronExpression(cronExpression);
  225. }
  226. jobList.add(job);
  227. }
  228. } catch (Exception e) {
  229. e.printStackTrace();
  230. }
  231. return jobList;
  232. }
  233. public Scheduler getScheduler() {
  234. return scheduler;
  235. }
  236. public void setScheduler(Scheduler scheduler) {
  237. this.scheduler = scheduler;
  238. }
  239. }

注意事项:

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

Xml代码  

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

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

Java代码  

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

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

Java代码  

  1. public class ScheduleJob implements Serializable{
  2. private Long scheduleJobId;
  3. /** 任务名称 */
  4. private String jobName;
  5. /** 任务分组 */
  6. private String jobGroup;
  7. /** 定时任务对应的类(包括包路径),如:cn.imovie.manage.task.job.TicketMoneyLessThanNormalWarn */
  8. private String clazz;
  9. /** 任务状态:1禁用 2启用 3删除*/
  10. private String jobStatus;
  11. /** 任务运行时间表达式 */
  12. private String cronExpression;
  13. /** 任务描述 */
  14. private String jobDesc;
  15. private Long createMan;
  16. private Date createTime;
  17. private Long updateMan;
  18. private Date updateTime;
  19. // 非持久化属性
  20. private String createManText;
  21. private String updateManText;
  22. public Long getScheduleJobId() {
  23. return scheduleJobId;
  24. }
  25. public void setScheduleJobId(Long scheduleJobId) {
  26. this.scheduleJobId = scheduleJobId;
  27. }
  28. public String getJobName() {
  29. return jobName;
  30. }
  31. public void setJobName(String jobName) {
  32. this.jobName = jobName;
  33. }
  34. public String getJobGroup() {
  35. return jobGroup;
  36. }
  37. public void setJobGroup(String jobGroup) {
  38. this.jobGroup = jobGroup;
  39. }
  40. public String getClazz() {
  41. return clazz;
  42. }
  43. public void setClazz(String clazz) {
  44. this.clazz = clazz;
  45. }
  46. public String getJobStatus() {
  47. return jobStatus;
  48. }
  49. public void setJobStatus(String jobStatus) {
  50. this.jobStatus = jobStatus;
  51. }
  52. public String getCronExpression() {
  53. return cronExpression;
  54. }
  55. public void setCronExpression(String cronExpression) {
  56. this.cronExpression = cronExpression;
  57. }
  58. public String getJobDesc() {
  59. return jobDesc;
  60. }
  61. public void setJobDesc(String jobDesc) {
  62. this.jobDesc = jobDesc;
  63. }
  64. public Long getCreateMan() {
  65. return createMan;
  66. }
  67. public void setCreateMan(Long createMan) {
  68. this.createMan = createMan;
  69. }
  70. public Date getCreateTime() {
  71. return createTime;
  72. }
  73. public void setCreateTime(Date createTime) {
  74. this.createTime = createTime;
  75. }
  76. public Long getUpdateMan() {
  77. return updateMan;
  78. }
  79. public void setUpdateMan(Long updateMan) {
  80. this.updateMan = updateMan;
  81. }
  82. public Date getUpdateTime() {
  83. return updateTime;
  84. }
  85. public void setUpdateTime(Date updateTime) {
  86. this.updateTime = updateTime;
  87. }
  88. @Transient
  89. public String getCreateManText() {
  90. return createManText;
  91. }
  92. public void setCreateManText(String createManText) {
  93. this.createManText = createManText;
  94. }
  95. @Transient
  96. public String getUpdateManText() {
  97. return updateManText;
  98. }
  99. public void setUpdateManText(String updateManText) {
  100. this.updateManText = updateManText;
  101. }
  102. }

三、Spring.xml 文件配置

Xml代码  

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

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

Java代码  

  1. #配置见:http://www.quartz-scheduler.org/documentation/quartz-2.2.x/configuration/ConfigJDBCJobStoreClustering.html
  2. #============================================================================
  3. # Configure Main Scheduler Properties
  4. #============================================================================
  5. org.quartz.scheduler.instanceName = MyClusteredScheduler
  6. org.quartz.scheduler.instanceId = AUTO
  7. #============================================================================
  8. # Configure ThreadPool
  9. #============================================================================
  10. org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
  11. org.quartz.threadPool.threadCount = 25
  12. org.quartz.threadPool.threadPriority = 5
  13. #============================================================================
  14. # Configure JobStore
  15. #============================================================================
  16. org.quartz.jobStore.misfireThreshold = 60000
  17. org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
  18. org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
  19. org.quartz.jobStore.useProperties = false
  20. org.quartz.jobStore.dataSource = myDS
  21. org.quartz.jobStore.tablePrefix = QRTZ_
  22. org.quartz.jobStore.isClustered = true
  23. org.quartz.jobStore.clusterCheckinInterval = 20000

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

?Copyright 蕃薯耀 2017年9月6日

http://www.cnblogs.com/fanshuyao/

时间: 2024-09-29 08:40:31

Spring4整合quartz2.2.3,quartz动态任务的相关文章

Spring4 Quartz2 动态任务,Spring4整合quartz2.2.3简单动态任务

 Spring4 Quartz2 动态任务 Spring4整合quartz2.2.3简单动态任务, Quartz2.2.3简单动态定时任务二, SimpleScheduleBuilder简单定时任务 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ?Copyright 蕃薯耀 2017年9月6日 h

Quartz动态添加、修改和删除定时任务

任务调度开源框架Quartz动态添加.修改和删除定时任务 Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.Quartz框架包含了调度器监听.作业和触发器监听.你可以配置作业和触发器监听为全局监听或者是特定于作业和触发器的监听.Quartz 允许开发人员根据时间间隔(或天)来调度作业.它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联.整合了 Quartz 的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业.并且还

(六)Spring4 整合Hibernate4,Struts2

第一节:S2SH 整合所需Jar 包 Struts2.3.16,Spring4.0.6,Hibernate4.3.5 整合所需jar 包: Struts2.3.16 jar 包 Spring4.0.6 jar 包 Hibernate4.3.5 jar 包 第二节:Spring4 整合Hibernate4 Spring4 接管Hibernate4 所有Bean 实例,以及SessionFactory,事务管理器: 泛型注入: 第三节:Spring4 整合Struts2 Spring4 接管Stru

MyBatis笔记----Mybatis3.4.2与spring4整合:增删查改

结构图 刚之前没什么区别,多了一个applicationContext.xml 包图 由于之前出了一点错误,有些包可能多加上了 数据库图 model User.java package com.ij34.model; public class User { private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.

Spring+quartz 动态任务调度

需求是这样的:系统中会有很多的执行时间,三个或者四个这样,不确定,以后可能是五个!当用户在页面添加执行时间时,我们后台也要对应执行用户添加的时间. 数据库设计: DROP TABLE IF EXISTS `test_time_task`; CREATE TABLE `test_time_task` ( `status` int(11) DEFAULT NULL COMMENT '状态:0为正常,1为禁用', `job` varchar(255) CHARACTER SET utf8 DEFAUL

Spring4 整合 Hibernate3 基本使用(通过注入 SessionFactory)

Spring4 整合 Hibernate3 基本使用(通过注入 SessionFactory) Spring4 整合 Hibernate3 基本使用通过注入 SessionFactory 步骤 1 导入 Maven 依赖 步骤 2 编写 beans 核心配置文件 步骤 3编写实体类 步骤4编写基于 Hibernate 的 DAO 层 步骤5编写测试方法 进一步研究 步骤 1 :导入 Maven 依赖 1.Spring4 的模块 spring-core.spring-context.spring-

Spring4整合Hibernate5时不能自动生成表结构

? 版权声明:本文为博主原创文章,转载请注明出处 1.问题描述: Spring4整合Hibernate5时,不再使用hibernate.cfg.xml,将其内容整合到Spring配置文件中,启动后不能自动创建表结构 2.解决方案: 设置hibernateProperties时,需要设置hibernate前缀 原本设置,不能自动创建表结构 <!-- 配置Hibernate相关属性 --> <bean id="sessionFactory" class="org

任务调度开源框架Quartz动态添加、修改和删除定时任务

Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.Quartz框架包含了调度器监听.作业和触发器监听.你可以配置作业和触发器监听为全局监听或者是特定于作业和触发器的监听.Quartz 允许开发人员根据时间间隔(或天)来调度作业.它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联.整合了 Quartz 的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业.并且还能和Spring配置整合使用.Quartz在功能上远远超越

Quartz动态配置表达的方法

在项目中有一个需求,需要灵活配置调度任务时间,并能自由启动或停止调度.有关调度的实现我就第一就想到了Quartz这个开源调度组件,因为很多项目使用过,Spring结合Quartz静态配置调度任务时间,非常easy.比如:每天凌晨几点定时运行一个程序,这只要在工程中的spring配置文件中配置好spring整合quartz的几个属性就好. Spring配置文件 Xml代码?? <bean?id="jobDetail"?class="org.springframework.