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

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

©Copyright 蕃薯耀 2017年9月6日

http://fanshuyao.iteye.com/

 quartz下载

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

一、quartz动态任务管理类:

  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 工具类获取。

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

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

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

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

  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 文件配置

  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 文件配置:

  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/

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

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

     Spring4 Quartz2 动态任务 Spring4整合quartz2.2.3简单动态任务, Quartz2.2.3简单动态定时任务二, SimpleScheduleBuilder简单定时任务 ...

  2. Spring定时任务,Spring4整合quartz2.2,quartz-scheduler定时任务

    Spring4整合quartz2.2,quartz-scheduler定时任务,Spring定时任务 >>>>>>>>>>>>& ...

  3. Quartz动态添加,修改,删除任务(暂停,任务状态,恢复,最近触发时间)

    首页 博客 学院 下载 图文课 论坛 APP 问答 商城 VIP会员 活动 招聘 ITeye GitChat 写博客 小程序 消息 登录注册 关闭 quartz_Cron表达式一分钟教程 09-05 ...

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

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

  5. Spring3 整合Quartz2 实现定时任务

    一.Quartz简介 Quartz是一个由James House创立的开源项目,是一个功能强大的作业调度工具,可以计划的执行任务,定时.循环或在某一个时间来执行我们需要做的事,这可以给我们工作上带来很 ...

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

    任务调度开源框架Quartz动态添加.修改和删除定时任务 Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.Quartz框架包含了调度器监听.作业和触 ...

  7. (六)Spring4 整合Hibernate4,Struts2

    第一节:S2SH 整合所需Jar 包 Struts2.3.16,Spring4.0.6,Hibernate4.3.5 整合所需jar 包: Struts2.3.16 jar 包 Spring4.0.6 ...

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

    © 版权声明:本文为博主原创文章,转载请注明出处 1.问题描述: Spring4整合Hibernate5时,不再使用hibernate.cfg.xml,将其内容整合到Spring配置文件中,启动后不能 ...

  9. 【Java Web开发学习】Spring4整合thymeleaf视图解析

    [Java Web开发学习]Spring4整合thymeleaf视图解析 目录 1.简单介绍2.简单例子 转载:https://www.cnblogs.com/yangchongxing/p/9111 ...

随机推荐

  1. iOS imageio nsurlsession 渐进式图片下载

    一.图片常用加载格式分两种 一般线性式 和交错/渐进式 自上而下线性式 先模糊再清晰 就概率上而言线性式使用最多,应为他所占空间普片比渐进式小.而这两种方式对于app端开发人员无需关心,这种图片存储格 ...

  2. Nlpir Parser敏感词搜索灵玖语义技术应用

    近年来随着网络技术的飞速发展和用户的剧烈增长,网络传输数据量越来越大,网络用语越来越趋于多样化.如何快速的屏蔽用户的不当言论.过滤用户发表内容中的非法词汇已成为关键词匹配领域的一项重大难题. 目前主要 ...

  3. 52. leetcode 96. Unique Binary Search Trees

    96. Unique Binary Search Trees Given n, how many structurally unique BST's (binary search trees) tha ...

  4. 手脱UPX(堆栈平衡原理)

    一开始看到pushad F8执行直到只有esp,eip,变化 在esp处follow in dump 下硬件访问断点 F9运行在硬件断点停下 到达一个长跳转(跳到OEP) 完成 ----------- ...

  5. Java第一个程序(CMD环境)

    在新学Java配置好JDK之后,根据例子用CMD命令运行第一个java程序出错.是这样的: 1,在某一个盘(最好是英文路径),新建记事本输入java程序,例如: 保存为HelloJava.java. ...

  6. Git 深入浅出

    如果你是一个开发人员,想用上这个世界上目前最先进的分布式版本控制系统,那么,赶快开始学习吧!(耐心读下去,收获满满) Git是什么? Git是目前世界上最先进的分布式版本控制系统(没有之一). Git ...

  7. 解决QT编程出现 C2001错误

    最近做项目时,在debug输出或者是在其他用到字符串常量的时候,总会时不时的出现C2001错误,提示"常量中有换行符", 比如 tr("删除此设备") 或者 q ...

  8. Linux操作系统-安装JAVA

    首先准备好jdk文件(例如:本地已下载了jdk-6u33-linux-x64.bin),将它上传到路径 “/home/username/” 这个目录的下面 其次按步骤执行: 1.进入到 “/home/ ...

  9. C语言开篇

    Linux下使用最广泛的C/C++编译器是GCC,大多数的Linux发行版本都默认安装,不管是开发人员还是初学者,一般都将GCC作为Linux下首选的编译工具. 1.小程序test_gets.c #i ...

  10. android学习笔记之GridView的使用

    除了listview会使用适配器外,还有一种就是GridView,listview是单列多行的显示形式,适用于多项目的查看.而GridView是多行多列的显示形式,一般用在查看图片样式的activit ...