资讯专栏INFORMATION COLUMN

SpringCloud(第 010 篇)简单 Quartz-Cluster 支持集群分布式且支持动态

xiyang / 2319人阅读

摘要:通过再添加其他的元素可在中放置多个触发器。停止触发器重启触发器停止触发器移除触发器添加调度的任务类调度的任务。执行的张表入数据库添加启动类简单微服务,支持集群分布式,并支持动态修改任务的执行时间。

SpringCloud(第 010 篇)简单 Quartz-Cluster 微服务,支持集群分布式,并支持动态修改 Quartz 任务的 cronExpression 执行时间

-

一、大致介绍

</>复制代码

  1. 1、根据上一章节的单台测试,本章节修改 Quartz 了支持分布式,因为这是更多的企业开发场景所需要的开发模式;
  2. 2、而且在定时任务执行的过程中,通过修改 Quartz 触发器表的 cronExpression 表达式值,从而达到动态修改定时任务的执行时间;
  3. 3、注意:配置文件中的 mysql 数据库链接配置大家就各自配置自己的哈;
二、实现步骤 2.1 添加 maven 引用包

</>复制代码

  1. 4.0.0
  2. springms-simple-quartz-cluster
  3. 1.0-SNAPSHOT
  4. jar
  5. com.springms.cloud
  6. springms-spring-cloud
  7. 1.0-SNAPSHOT
  8. org.springframework.boot
  9. spring-boot-starter-data-jpa
  10. org.springframework.boot
  11. spring-boot-starter-web
  12. mysql
  13. mysql-connector-java
  14. org.springframework.boot
  15. spring-boot-starter-jdbc
  16. org.quartz-scheduler
  17. quartz
  18. 2.3.0
  19. org.quartz-scheduler
  20. quartz-jobs
  21. 2.3.0
  22. org.springframework
  23. spring-context-support
  24. com.alibaba
  25. druid
  26. 1.1.3
2.2 添加应用配置文件(springms-simple-quartz-cluster/src/main/resources/application.yml)

</>复制代码

  1. server:
  2. port: 8395
  3. spring:
  4. application:
  5. name: springms-simple-quartz-cluster #全部小写
  6. #####################################################################################################
  7. # mysql 属性配置
  8. datasource:
  9. driver-class-name: com.mysql.jdbc.Driver
  10. url: jdbc:mysql://ip:port/hmilyylimh?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
  11. username: username
  12. password: password
  13. jpa:
  14. hibernate:
  15. #ddl-auto: create #ddl-auto:设为create表示每次都重新建表
  16. ddl-auto: update #ddl-auto:设为update表示每次都不会重新建表
  17. show-sql: true
  18. #####################################################################################################
  19. #####################################################################################################
  20. #########mysql######### 注释先不用这些属性
  21. #spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
  22. #spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  23. #spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
  24. #spring.datasource.username=test
  25. #spring.datasource.password=test
  26. #
  27. #
  28. #spring.datasource.initialSize=5
  29. #spring.datasource.minIdle=5
  30. #spring.datasource.maxActive=20
  31. #spring.datasource.maxWait=60000
  32. #
  33. #
  34. #spring.datasource.timeBetweenEvictionRunsMillis=3600000
  35. #spring.datasource.minEvictableIdleTimeMillis=18000000
  36. #
  37. #
  38. #spring.datasource.validationQuery=SELECT 1 FROM DUAL
  39. #spring.datasource.testWhileIdle=true
  40. #spring.datasource.testOnBorrow=true
  41. #spring.datasource.testOnReturn=true
  42. #spring.datasource.poolPreparedStatements=true
  43. #spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
  44. #spring.datasource.filters=stat,wall,log4j
  45. #spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
  46. #####################################################################################################
  47. #####################################################################################################
  48. # 打印日志
  49. logging:
  50. level:
  51. root: INFO
  52. org.hibernate: INFO
  53. org.hibernate.type.descriptor.sql.BasicBinder: TRACE
  54. org.hibernate.type.descriptor.sql.BasicExtractor: TRACE
  55. com.springms: DEBUG
  56. #####################################################################################################
2.3 添加 quartz 配置文件(springms-simple-quartz-cluster/src/main/resources/quartz.properties)

</>复制代码

  1. org.quartz.scheduler.instanceName = quartzScheduler
  2. org.quartz.scheduler.instanceId = AUTO
  3. org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
  4. org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
  5. org.quartz.jobStore.tablePrefix = QRTZ_
  6. org.quartz.jobStore.isClustered = true
  7. org.quartz.jobStore.useProperties = false
  8. org.quartz.jobStore.clusterCheckinInterval = 20000
  9. org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
  10. org.quartz.threadPool.threadCount = 10
  11. org.quartz.threadPool.threadPriority = 5
  12. org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
2.4 添加 quartz 任务配置文件(springms-simple-quartz-cluster/src/main/resources/quartz.xml)

</>复制代码

  1. com.springms.cloud.job.DetailQuartzJobBean
  2. 0/10 * * * * ?
2.5 添加定时任务作业类(springms-simple-quartz-cluster/src/main/java/com/springms/cloud/job/DetailQuartzJobBean.java)

</>复制代码

  1. package com.springms.cloud.job;
  2. import org.quartz.JobExecutionContext;
  3. import org.quartz.JobExecutionException;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.context.ApplicationContext;
  6. import org.springframework.scheduling.quartz.QuartzJobBean;
  7. import java.lang.reflect.Method;
  8. import java.text.SimpleDateFormat;
  9. import java.util.Date;
  10. /**
  11. * 定时任务作业类。
  12. *
  13. * @author hmilyylimh
  14. *
  15. * @version 0.0.1
  16. *
  17. * @date 17/9/18
  18. *
  19. */
  20. public class DetailQuartzJobBean extends QuartzJobBean {
  21. private String targetObject;
  22. private String targetMethod;
  23. private ApplicationContext ctx;
  24. // 配置中设定了
  25. // ① targetMethod: 指定需要定时执行scheduleInfoAction中的simpleJobTest()方法
  26. // ② concurrent:对于相同的JobDetail,当指定多个Trigger时, 很可能第一个job完成之前,
  27. // 第二个job就开始了。指定concurrent设为false,多个job不会并发运行,第二个job将不会在第一个job完成之前开始。
  28. // ③ cronExpression:0/10 * * * * ?表示每10秒执行一次,具体可参考附表。
  29. // ④ triggers:通过再添加其他的ref元素可在list中放置多个触发器。 scheduleInfoAction中的simpleJobTest()方法
  30. @Override
  31. protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
  32. try {
  33. Object otargetObject = ctx.getBean(targetObject);
  34. Method m = null;
  35. System.out.println(targetObject + " - " + targetMethod + " - " + ((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")).format(new Date())));
  36. try {
  37. m = otargetObject.getClass().getMethod(targetMethod, new Class[] { JobExecutionContext.class });
  38. m.invoke(otargetObject, new Object[] { context });
  39. } catch (SecurityException e) {
  40. // Logger.error(e);
  41. System.out.println(e.getMessage());
  42. } catch (NoSuchMethodException e) {
  43. // Logger.error(e);
  44. System.out.println(e.getMessage());
  45. }
  46. } catch (Exception e) {
  47. System.out.println(e.getMessage());
  48. throw new JobExecutionException(e);
  49. }
  50. }
  51. public void setApplicationContext(ApplicationContext applicationContext) {
  52. this.ctx = applicationContext;
  53. }
  54. public void setTargetObject(String targetObject) {
  55. this.targetObject = targetObject;
  56. }
  57. public void setTargetMethod(String targetMethod) {
  58. this.targetMethod = targetMethod;
  59. }
  60. }
2.6 添加调度服务接口(springms-simple-quartz-cluster/src/main/java/com/springms/cloud/service/ISchedulerService.java)

</>复制代码

  1. package com.springms.cloud.service;
  2. import java.util.Date;
  3. import org.quartz.CronExpression;
  4. /**
  5. * 调度服务接口。
  6. *
  7. * @author hmilyylimh
  8. *
  9. * @version 0.0.1
  10. *
  11. * @date 2017/9/18
  12. *
  13. */
  14. public interface ISchedulerService {
  15. /**
  16. * 根据 Quartz Cron Expression 调试任务
  17. *
  18. * @param cronExpression
  19. * Quartz Cron 表达式,如 "0/10 * * ? * * *"
  20. */
  21. void schedule(String cronExpression);
  22. /**
  23. * 根据 Quartz Cron Expression 调试任务
  24. *
  25. * @param name
  26. * Quartz CronTrigger名称
  27. * @param cronExpression
  28. * Quartz Cron 表达式,如 "0/10 * * ? * * *"
  29. */
  30. void schedule(String name, String cronExpression);
  31. /**
  32. * 根据 Quartz Cron Expression 调试任务
  33. *
  34. * @param name
  35. * Quartz CronTrigger名称
  36. * @param group
  37. * Quartz CronTrigger组
  38. * @param cronExpression
  39. * Quartz Cron 表达式,如 "0/10 * * ? * * *"
  40. */
  41. void schedule(String name, String group, String cronExpression);
  42. /**
  43. * 根据 Quartz Cron Expression 调试任务
  44. *
  45. * @param cronExpression
  46. * Quartz CronExpression
  47. */
  48. void schedule(CronExpression cronExpression);
  49. /**
  50. * 根据 Quartz Cron Expression 调试任务
  51. *
  52. * @param name
  53. * Quartz CronTrigger名称
  54. * @param cronExpression
  55. * Quartz CronExpression
  56. */
  57. void schedule(String name, CronExpression cronExpression);
  58. /**
  59. * 根据 Quartz Cron Expression 调试任务
  60. *
  61. * @param name
  62. * Quartz CronTrigger名称
  63. * @param group
  64. * Quartz CronTrigger组
  65. * @param cronExpression
  66. * Quartz CronExpression
  67. */
  68. void schedule(String name, String group, CronExpression cronExpression);
  69. /**
  70. * 在startTime时执行调试一次
  71. *
  72. * @param startTime
  73. * 调度开始时间
  74. */
  75. void schedule(Date startTime);
  76. void schedule(Date startTime, String group);
  77. /**
  78. * 在startTime时执行调试一次
  79. *
  80. * @param name
  81. * Quartz SimpleTrigger 名称
  82. * @param startTime
  83. * 调度开始时间
  84. */
  85. void schedule(String name, Date startTime);
  86. void schedule(String name, Date startTime, String group);
  87. /**
  88. * 在startTime时执行调试,endTime结束执行调度
  89. *
  90. * @param startTime
  91. * 调度开始时间
  92. * @param endTime
  93. * 调度结束时间
  94. */
  95. void schedule(Date startTime, Date endTime);
  96. void schedule(Date startTime, Date endTime, String group);
  97. /**
  98. * 在startTime时执行调试,endTime结束执行调度
  99. *
  100. * @param name
  101. * Quartz SimpleTrigger 名称
  102. * @param startTime
  103. * 调度开始时间
  104. * @param endTime
  105. * 调度结束时间
  106. */
  107. void schedule(String name, Date startTime, Date endTime);
  108. void schedule(String name, Date startTime, Date endTime, String group);
  109. /**
  110. * 在startTime时执行调试,endTime结束执行调度,重复执行repeatCount次
  111. *
  112. * @param startTime
  113. * 调度开始时间
  114. * @param repeatCount
  115. * 重复执行次数
  116. */
  117. void schedule(Date startTime, int repeatCount);
  118. /**
  119. * 在startTime时执行调试,endTime结束执行调度,重复执行repeatCount次
  120. *
  121. * @param startTime
  122. * 调度开始时间
  123. * @param endTime
  124. * 调度结束时间
  125. * @param repeatCount
  126. * 重复执行次数
  127. */
  128. void schedule(Date startTime, Date endTime, int repeatCount);
  129. void schedule(Date startTime, Date endTime, int repeatCount, String group);
  130. /**
  131. * 在startTime时执行调试,endTime结束执行调度,重复执行repeatCount次
  132. *
  133. * @param name
  134. * Quartz SimpleTrigger 名称
  135. * @param startTime
  136. * 调度开始时间
  137. * @param endTime
  138. * 调度结束时间
  139. * @param repeatCount
  140. * 重复执行次数
  141. */
  142. void schedule(String name, Date startTime, Date endTime, int repeatCount);
  143. void schedule(String name, Date startTime, Date endTime, int repeatCount, String group);
  144. /**
  145. * 在startTime时执行调试,endTime结束执行调度,重复执行repeatCount次,每隔repeatInterval秒执行一次
  146. *
  147. * @param startTime
  148. * 调度开始时间
  149. *
  150. * @param repeatCount
  151. * 重复执行次数
  152. * @param repeatInterval
  153. * 执行时间隔间
  154. */
  155. void schedule(Date startTime, int repeatCount, long repeatInterval);
  156. /**
  157. * 在startTime时执行调试,endTime结束执行调度,重复执行repeatCount次,每隔repeatInterval秒执行一次
  158. *
  159. * @param startTime
  160. * 调度开始时间
  161. * @param endTime
  162. * 调度结束时间
  163. * @param repeatCount
  164. * 重复执行次数
  165. * @param repeatInterval
  166. * 执行时间隔间
  167. */
  168. void schedule(Date startTime, Date endTime, int repeatCount, long repeatInterval);
  169. void schedule(Date startTime, Date endTime, int repeatCount, long repeatInterval, String group);
  170. /**
  171. * 在startTime时执行调试,endTime结束执行调度,重复执行repeatCount次,每隔repeatInterval秒执行一次
  172. *
  173. * @param name
  174. * Quartz SimpleTrigger 名称
  175. * @param startTime
  176. * 调度开始时间
  177. * @param endTime
  178. * 调度结束时间
  179. * @param repeatCount
  180. * 重复执行次数
  181. * @param repeatInterval
  182. * 执行时间隔间
  183. */
  184. void schedule(String name, Date startTime, Date endTime, int repeatCount, long repeatInterval);
  185. void schedule(String name, Date startTime, Date endTime, int repeatCount, long repeatInterval, String group);
  186. /**
  187. * 暂停触发器
  188. *
  189. * @param triggerName
  190. * 触发器名称
  191. */
  192. void pauseTrigger(String triggerName);
  193. /**
  194. * 暂停触发器
  195. *
  196. * @param triggerName
  197. * 触发器名称
  198. * @param group
  199. * 触发器组
  200. */
  201. void pauseTrigger(String triggerName, String group);
  202. /**
  203. * 恢复触发器
  204. *
  205. * @param triggerName
  206. * 触发器名称
  207. */
  208. void resumeTrigger(String triggerName);
  209. /**
  210. * 恢复触发器
  211. *
  212. * @param triggerName
  213. * 触发器名称
  214. * @param group
  215. * 触发器组
  216. */
  217. void resumeTrigger(String triggerName, String group);
  218. /**
  219. * 删除触发器
  220. *
  221. * @param triggerName
  222. * 触发器名称
  223. * @return
  224. */
  225. boolean removeTrigdger(String triggerName);
  226. /**
  227. * 删除触发器
  228. *
  229. * @param triggerName
  230. * 触发器名称
  231. * @param group
  232. * 触发器组
  233. * @return
  234. */
  235. boolean removeTrigdger(String triggerName, String group);
  236. }
2.7 添加调度服务实现类(springms-simple-quartz-cluster/src/main/java/com/springms/cloud/service/impl/SchedulerServiceImpl.java)

</>复制代码

  1. package com.springms.cloud.service.impl;
  2. import java.text.ParseException;
  3. import java.util.Date;
  4. import java.util.UUID;
  5. import com.springms.cloud.service.ISchedulerService;
  6. import org.quartz.CronExpression;
  7. import org.quartz.JobDetail;
  8. import org.quartz.Scheduler;
  9. import org.quartz.SchedulerException;
  10. import org.quartz.TriggerKey;
  11. import org.quartz.impl.triggers.CronTriggerImpl;
  12. import org.quartz.impl.triggers.SimpleTriggerImpl;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.stereotype.Service;
  15. /**
  16. * 调度服务实现类。
  17. *
  18. * @author hmilyylimh
  19. *
  20. * @version 0.0.1
  21. *
  22. * @date 2017/9/18
  23. *
  24. */
  25. @Service("schedulerService")
  26. public class SchedulerServiceImpl implements ISchedulerService {
  27. private static final String NULLSTRING = null;
  28. private static final Date NULLDATE = null;
  29. @Autowired
  30. private Scheduler scheduler;
  31. @Autowired
  32. private JobDetail jobDetail;
  33. @Override
  34. public void schedule(String cronExpression) {
  35. schedule(NULLSTRING, cronExpression);
  36. }
  37. @Override
  38. public void schedule(String name, String cronExpression) {
  39. schedule(name, NULLSTRING, cronExpression);
  40. }
  41. @Override
  42. public void schedule(String name, String group, String cronExpression) {
  43. try {
  44. schedule(name, group, new CronExpression(cronExpression));
  45. } catch (ParseException e) {
  46. throw new IllegalArgumentException(e);
  47. }
  48. }
  49. @Override
  50. public void schedule(CronExpression cronExpression) {
  51. schedule(NULLSTRING, cronExpression);
  52. }
  53. @Override
  54. public void schedule(String name, CronExpression cronExpression) {
  55. schedule(name, NULLSTRING, cronExpression);
  56. }
  57. @Override
  58. public void schedule(String name, String group, CronExpression cronExpression) {
  59. if (isValidExpression(cronExpression)) {
  60. if (name == null || name.trim().equals("")) {
  61. name = UUID.randomUUID().toString();
  62. }
  63. CronTriggerImpl trigger = new CronTriggerImpl();
  64. trigger.setCronExpression(cronExpression);
  65. TriggerKey triggerKey = new TriggerKey(name, group);
  66. trigger.setJobName(jobDetail.getKey().getName());
  67. trigger.setKey(triggerKey);
  68. try {
  69. scheduler.addJob(jobDetail, true);
  70. if (scheduler.checkExists(triggerKey)) {
  71. scheduler.rescheduleJob(triggerKey, trigger);
  72. } else {
  73. scheduler.scheduleJob(trigger);
  74. }
  75. } catch (SchedulerException e) {
  76. throw new IllegalArgumentException(e);
  77. }
  78. }
  79. }
  80. @Override
  81. public void schedule(Date startTime) {
  82. schedule(startTime, NULLDATE);
  83. }
  84. @Override
  85. public void schedule(Date startTime, String group) {
  86. schedule(startTime, NULLDATE, group);
  87. }
  88. @Override
  89. public void schedule(String name, Date startTime) {
  90. schedule(name, startTime, NULLDATE);
  91. }
  92. @Override
  93. public void schedule(String name, Date startTime, String group) {
  94. schedule(name, startTime, NULLDATE, group);
  95. }
  96. @Override
  97. public void schedule(Date startTime, Date endTime) {
  98. schedule(startTime, endTime, 0);
  99. }
  100. @Override
  101. public void schedule(Date startTime, Date endTime, String group) {
  102. schedule(startTime, endTime, 0, group);
  103. }
  104. @Override
  105. public void schedule(String name, Date startTime, Date endTime) {
  106. schedule(name, startTime, endTime, 0);
  107. }
  108. @Override
  109. public void schedule(String name, Date startTime, Date endTime, String group) {
  110. schedule(name, startTime, endTime, 0, group);
  111. }
  112. @Override
  113. public void schedule(Date startTime, int repeatCount) {
  114. schedule(null, startTime, NULLDATE, 0);
  115. }
  116. @Override
  117. public void schedule(Date startTime, Date endTime, int repeatCount) {
  118. schedule(null, startTime, endTime, 0);
  119. }
  120. @Override
  121. public void schedule(Date startTime, Date endTime, int repeatCount, String group) {
  122. schedule(null, startTime, endTime, 0, group);
  123. }
  124. @Override
  125. public void schedule(String name, Date startTime, Date endTime, int repeatCount) {
  126. schedule(name, startTime, endTime, 0, 0L);
  127. }
  128. @Override
  129. public void schedule(String name, Date startTime, Date endTime, int repeatCount, String group) {
  130. schedule(name, startTime, endTime, 0, 0L, group);
  131. }
  132. @Override
  133. public void schedule(Date startTime, int repeatCount, long repeatInterval) {
  134. schedule(null, startTime, NULLDATE, repeatCount, repeatInterval);
  135. }
  136. @Override
  137. public void schedule(Date startTime, Date endTime, int repeatCount, long repeatInterval) {
  138. schedule(null, startTime, endTime, repeatCount, repeatInterval);
  139. }
  140. @Override
  141. public void schedule(Date startTime, Date endTime, int repeatCount, long repeatInterval, String group) {
  142. schedule(null, startTime, endTime, repeatCount, repeatInterval, group);
  143. }
  144. @Override
  145. public void schedule(String name, Date startTime, Date endTime, int repeatCount, long repeatInterval) {
  146. schedule(name, startTime, endTime, repeatCount, repeatInterval, NULLSTRING);
  147. }
  148. @Override
  149. public void schedule(String name, Date startTime, Date endTime, int repeatCount, long repeatInterval, String group) {
  150. if (this.isValidExpression(startTime)) {
  151. if (name == null || name.trim().equals("")) {
  152. name = UUID.randomUUID().toString();
  153. }
  154. TriggerKey triggerKey = new TriggerKey(name, group);
  155. SimpleTriggerImpl trigger = new SimpleTriggerImpl();
  156. trigger.setKey(triggerKey);
  157. trigger.setJobName(jobDetail.getKey().getName());
  158. trigger.setStartTime(startTime);
  159. trigger.setEndTime(endTime);
  160. trigger.setRepeatCount(repeatCount);
  161. trigger.setRepeatInterval(repeatInterval);
  162. try {
  163. scheduler.addJob(jobDetail, true);
  164. if (scheduler.checkExists(triggerKey)) {
  165. scheduler.rescheduleJob(triggerKey, trigger);
  166. } else {
  167. scheduler.scheduleJob(trigger);
  168. }
  169. } catch (SchedulerException e) {
  170. throw new IllegalArgumentException(e);
  171. }
  172. }
  173. }
  174. @Override
  175. public void pauseTrigger(String triggerName) {
  176. pauseTrigger(triggerName, NULLSTRING);
  177. }
  178. @Override
  179. public void pauseTrigger(String triggerName, String group) {
  180. try {
  181. scheduler.pauseTrigger(new TriggerKey(triggerName, group));// 停止触发器
  182. } catch (SchedulerException e) {
  183. throw new RuntimeException(e);
  184. }
  185. }
  186. @Override
  187. public void resumeTrigger(String triggerName) {
  188. resumeTrigger(triggerName, NULLSTRING);
  189. }
  190. @Override
  191. public void resumeTrigger(String triggerName, String group) {
  192. try {
  193. scheduler.resumeTrigger(new TriggerKey(triggerName, group));// 重启触发器
  194. } catch (SchedulerException e) {
  195. throw new RuntimeException(e);
  196. }
  197. }
  198. @Override
  199. public boolean removeTrigdger(String triggerName) {
  200. return removeTrigdger(triggerName, NULLSTRING);
  201. }
  202. @Override
  203. public boolean removeTrigdger(String triggerName, String group) {
  204. TriggerKey triggerKey = new TriggerKey(triggerName, group);
  205. try {
  206. scheduler.pauseTrigger(triggerKey);// 停止触发器
  207. return scheduler.unscheduleJob(triggerKey);// 移除触发器
  208. } catch (SchedulerException e) {
  209. throw new RuntimeException(e);
  210. }
  211. }
  212. private boolean isValidExpression(final CronExpression cronExpression) {
  213. CronTriggerImpl trigger = new CronTriggerImpl();
  214. trigger.setCronExpression(cronExpression);
  215. Date date = trigger.computeFirstFireTime(null);
  216. return date != null && date.after(new Date());
  217. }
  218. private boolean isValidExpression(final Date startTime) {
  219. SimpleTriggerImpl trigger = new SimpleTriggerImpl();
  220. trigger.setStartTime(startTime);
  221. Date date = trigger.computeFirstFireTime(null);
  222. return date != null && date.after(new Date());
  223. }
  224. }
2.8 添加调度的任务类(springms-simple-quartz-cluster/src/main/java/com/springms/cloud/task/ScheduleTask.java)

</>复制代码

  1. package com.springms.cloud.task;
  2. import org.quartz.JobExecutionContext;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.context.annotation.Configuration;
  6. import org.springframework.scheduling.annotation.EnableScheduling;
  7. import org.springframework.stereotype.Component;
  8. /**
  9. * 调度的任务。
  10. *
  11. * testScheduleTask 字符串名称在 quartz.xml 中配置为属性 targetObject 的 value 值。
  12. * sayHello 方法名称在 quartz.xml 中配置为属性 targetMethod 的 value 值。
  13. *
  14. * @author hmilyylimh
  15. *
  16. * @version 0.0.1
  17. *
  18. * @date 2017/9/18
  19. *
  20. */
  21. @Configuration
  22. @Component("testScheduleTask")
  23. @EnableScheduling
  24. public class ScheduleTask {
  25. private static final Logger Logger = LoggerFactory.getLogger(ScheduleTask.class);
  26. public void sayHello(JobExecutionContext context){
  27. Logger.info("==== sayHello 123456789 ====");
  28. System.out.println("==== sayHello 123456789 ====");
  29. }
  30. }
2.9 添加Web层Controller测试类(springms-simple-quartz-cluster/src/main/java/com/springms/cloud/controller/QuartzClusterController.java)

</>复制代码

  1. package com.springms.cloud.controller;
  2. import com.springms.cloud.service.ISchedulerService;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.PathVariable;
  6. import org.springframework.web.bind.annotation.RestController;
  7. /**
  8. * QuartzCluster 分布式修改调度服务的Controller。
  9. *
  10. * @author hmilyylimh
  11. *
  12. * @version 0.0.1
  13. *
  14. * @date 2017/9/18
  15. *
  16. */
  17. @RestController
  18. public class QuartzClusterController {
  19. @Autowired
  20. private ISchedulerService schedulerService;
  21. /**
  22. * 每隔多少秒调度一次。
  23. *
  24. * @param seconds
  25. * @return
  26. */
  27. @GetMapping("/modify/{seconds}")
  28. public String modifyStartQuartz(@PathVariable String seconds){
  29. // eg: 0/10 * * ? * * *
  30. try {
  31. schedulerService.schedule("testJobTrigger", "DEFAULT", "0/" + seconds + " * * ? * * *");
  32. } catch (Exception e) {
  33. return "Failed";
  34. }
  35. return "Successful";
  36. }
  37. }
2.10 执行 Quartz 的 11 张表入数据库(springms-simple-quartz-cluster/quartz-tables.log)

</>复制代码

  1. DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
  2. DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
  3. DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
  4. DROP TABLE IF EXISTS QRTZ_LOCKS;
  5. DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
  6. DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
  7. DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
  8. DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
  9. DROP TABLE IF EXISTS QRTZ_TRIGGERS;
  10. DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
  11. DROP TABLE IF EXISTS QRTZ_CALENDARS;
  12. CREATE TABLE QRTZ_JOB_DETAILS
  13. (
  14. SCHED_NAME VARCHAR(120) NOT NULL,
  15. JOB_NAME VARCHAR(200) NOT NULL,
  16. JOB_GROUP VARCHAR(200) NOT NULL,
  17. DESCRIPTION VARCHAR(250) NULL,
  18. JOB_CLASS_NAME VARCHAR(250) NOT NULL,
  19. IS_DURABLE VARCHAR(1) NOT NULL,
  20. IS_NONCONCURRENT VARCHAR(1) NOT NULL,
  21. IS_UPDATE_DATA VARCHAR(1) NOT NULL,
  22. REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
  23. JOB_DATA BLOB NULL,
  24. PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
  25. );
  26. CREATE TABLE QRTZ_TRIGGERS
  27. (
  28. SCHED_NAME VARCHAR(120) NOT NULL,
  29. TRIGGER_NAME VARCHAR(200) NOT NULL,
  30. TRIGGER_GROUP VARCHAR(200) NOT NULL,
  31. JOB_NAME VARCHAR(200) NOT NULL,
  32. JOB_GROUP VARCHAR(200) NOT NULL,
  33. DESCRIPTION VARCHAR(250) NULL,
  34. NEXT_FIRE_TIME BIGINT(13) NULL,
  35. PREV_FIRE_TIME BIGINT(13) NULL,
  36. PRIORITY INTEGER NULL,
  37. TRIGGER_STATE VARCHAR(16) NOT NULL,
  38. TRIGGER_TYPE VARCHAR(8) NOT NULL,
  39. START_TIME BIGINT(13) NOT NULL,
  40. END_TIME BIGINT(13) NULL,
  41. CALENDAR_NAME VARCHAR(200) NULL,
  42. MISFIRE_INSTR SMALLINT(2) NULL,
  43. JOB_DATA BLOB NULL,
  44. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
  45. FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
  46. REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP)
  47. );
  48. CREATE TABLE QRTZ_SIMPLE_TRIGGERS
  49. (
  50. SCHED_NAME VARCHAR(120) NOT NULL,
  51. TRIGGER_NAME VARCHAR(200) NOT NULL,
  52. TRIGGER_GROUP VARCHAR(200) NOT NULL,
  53. REPEAT_COUNT BIGINT(7) NOT NULL,
  54. REPEAT_INTERVAL BIGINT(12) NOT NULL,
  55. TIMES_TRIGGERED BIGINT(10) NOT NULL,
  56. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
  57. FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
  58. REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
  59. );
  60. CREATE TABLE QRTZ_CRON_TRIGGERS
  61. (
  62. SCHED_NAME VARCHAR(120) NOT NULL,
  63. TRIGGER_NAME VARCHAR(200) NOT NULL,
  64. TRIGGER_GROUP VARCHAR(200) NOT NULL,
  65. CRON_EXPRESSION VARCHAR(200) NOT NULL,
  66. TIME_ZONE_ID VARCHAR(80),
  67. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
  68. FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
  69. REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
  70. );
  71. CREATE TABLE QRTZ_SIMPROP_TRIGGERS
  72. (
  73. SCHED_NAME VARCHAR(120) NOT NULL,
  74. TRIGGER_NAME VARCHAR(200) NOT NULL,
  75. TRIGGER_GROUP VARCHAR(200) NOT NULL,
  76. STR_PROP_1 VARCHAR(512) NULL,
  77. STR_PROP_2 VARCHAR(512) NULL,
  78. STR_PROP_3 VARCHAR(512) NULL,
  79. INT_PROP_1 INT NULL,
  80. INT_PROP_2 INT NULL,
  81. LONG_PROP_1 BIGINT NULL,
  82. LONG_PROP_2 BIGINT NULL,
  83. DEC_PROP_1 NUMERIC(13,4) NULL,
  84. DEC_PROP_2 NUMERIC(13,4) NULL,
  85. BOOL_PROP_1 VARCHAR(1) NULL,
  86. BOOL_PROP_2 VARCHAR(1) NULL,
  87. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
  88. FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
  89. REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
  90. );
  91. CREATE TABLE QRTZ_BLOB_TRIGGERS
  92. (
  93. SCHED_NAME VARCHAR(120) NOT NULL,
  94. TRIGGER_NAME VARCHAR(200) NOT NULL,
  95. TRIGGER_GROUP VARCHAR(200) NOT NULL,
  96. BLOB_DATA BLOB NULL,
  97. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
  98. FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
  99. REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
  100. );
  101. CREATE TABLE QRTZ_CALENDARS
  102. (
  103. SCHED_NAME VARCHAR(120) NOT NULL,
  104. CALENDAR_NAME VARCHAR(200) NOT NULL,
  105. CALENDAR BLOB NOT NULL,
  106. PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)
  107. );
  108. CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS
  109. (
  110. SCHED_NAME VARCHAR(120) NOT NULL,
  111. TRIGGER_GROUP VARCHAR(200) NOT NULL,
  112. PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)
  113. );
  114. CREATE TABLE QRTZ_FIRED_TRIGGERS
  115. (
  116. SCHED_NAME VARCHAR(120) NOT NULL,
  117. ENTRY_ID VARCHAR(95) NOT NULL,
  118. TRIGGER_NAME VARCHAR(200) NOT NULL,
  119. TRIGGER_GROUP VARCHAR(200) NOT NULL,
  120. INSTANCE_NAME VARCHAR(200) NOT NULL,
  121. FIRED_TIME BIGINT(13) NOT NULL,
  122. SCHED_TIME BIGINT(13) NOT NULL,
  123. PRIORITY INTEGER NOT NULL,
  124. STATE VARCHAR(16) NOT NULL,
  125. JOB_NAME VARCHAR(200) NULL,
  126. JOB_GROUP VARCHAR(200) NULL,
  127. IS_NONCONCURRENT VARCHAR(1) NULL,
  128. REQUESTS_RECOVERY VARCHAR(1) NULL,
  129. PRIMARY KEY (SCHED_NAME,ENTRY_ID)
  130. );
  131. CREATE TABLE QRTZ_SCHEDULER_STATE
  132. (
  133. SCHED_NAME VARCHAR(120) NOT NULL,
  134. INSTANCE_NAME VARCHAR(200) NOT NULL,
  135. LAST_CHECKIN_TIME BIGINT(13) NOT NULL,
  136. CHECKIN_INTERVAL BIGINT(13) NOT NULL,
  137. PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)
  138. );
  139. CREATE TABLE QRTZ_LOCKS
  140. (
  141. SCHED_NAME VARCHAR(120) NOT NULL,
  142. LOCK_NAME VARCHAR(40) NOT NULL,
  143. PRIMARY KEY (SCHED_NAME,LOCK_NAME)
  144. );
  145. commit;
2.11 添加 Quartz-Cluster 启动类(springms-simple-quartz-cluster/src/main/java/com/springms/cloud/SimpleQuartzClusterApplication.java)

</>复制代码

  1. package com.springms.cloud;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.boot.SpringApplication;
  5. import org.springframework.boot.autoconfigure.SpringBootApplication;
  6. import org.springframework.context.annotation.ImportResource;
  7. /**
  8. * 简单 Quartz-Cluster 微服务,支持集群分布式,并支持动态修改 Quartz 任务的 cronExpression 执行时间。
  9. *
  10. * @author hmilyylimh
  11. *
  12. * @version 0.0.1
  13. *
  14. * @date 17/9/18
  15. *
  16. */
  17. @SpringBootApplication
  18. @ImportResource("quartz.xml")
  19. public class SimpleQuartzClusterApplication {
  20. private static final Logger Logger = LoggerFactory.getLogger(SimpleQuartzClusterApplication.class);
  21. public static void main(String[] args) {
  22. Logger.info("简单Quartz-Cluster微服务入口函数编码-" + System.getProperty("file.encoding"));
  23. SpringApplication.run(SimpleQuartzClusterApplication.class, args);
  24. System.out.println("【【【【【【 简单Quartz-Cluster微服务 】】】】】】已启动.");
  25. }
  26. }
三、测试

</>复制代码

  1. /****************************************************************************************
  2. 一、简单 Quartz-Cluster 微服务,支持集群分布式,并支持动态修改 Quartz 任务的 cronExpression 执行时间:
  3. 1、添加 Quartz 相关配置文件;
  4. 2、启动 springms-simple-quartz-cluster 模块服务,启动1个端口(8395);
  5. 3、然后查看日志, ScheduleTask 类的 sayHello 方法被有规律的调用,并打印日志出来;
  6. 4、启动 springms-simple-quartz-cluster 模块服务,再启动2个端口(8396、8397);
  7. 5、然后看到 3 台服务器只有 1 台服务器调用了 sayHello 方法,因此 Quartz 的集群分布式也算是部署成功了;
  8. ****************************************************************************************/
  9. /****************************************************************************************
  10. 二、简单 Quartz-Cluster 微服务,支持集群分布式,并支持动态修改 Quartz 任务的 cronExpression 执行时间(动态修改定时任务的 cronExpression 时间表达式):
  11. 1、添加 Quartz 相关配置文件;
  12. 2、启动 springms-simple-quartz-cluster 模块服务,启动3个端口(8395、8396、8397);
  13. 3、然后看到 3 台服务器只有 1 台服务器调用了 sayHello 方法打印了日志,因此 Quartz 的集群分布式也算是部署成功了;
  14. 4、然后新起网页输入 http://localhost:8395/modify/5 修改定时任务的触发时间;
  15. 5、再等一会儿就看到 3 台服务器只有 1 台服务器每隔 5 秒调用一次 sayHello 方法,因此修改定时任务的克隆表达式也算是成功了;
  16. ****************************************************************************************/
  17. /****************************************************************************************
  18. 三、简单 Quartz-Cluster 微服务,支持集群分布式,并支持动态修改 Quartz 任务的 cronExpression 执行时间(动态删除其中 1 台活跃 Quartz 服务器,然后剩下的其中 1 台自动接替):
  19. 1、添加 Quartz 相关配置文件;
  20. 2、启动 springms-simple-quartz-cluster 模块服务,启动3个端口(8395、8396、8397);
  21. 3、然后看到 3 台服务器只有 1 台服务器调用了 sayHello 方法打印了日志,因此 Quartz 的集群分布式也算是部署成功了;
  22. 4、然后关闭 1 台活跃 Quartz 服务器;
  23. 5、再等一会儿就看到 2 台服务器中的 1 台服务器每隔一定的时间调用一次 sayHello 方法;
  24. ****************************************************************************************/
四、下载地址

https://gitee.com/ylimhhmily/SpringCloudTutorial.git

SpringCloudTutorial交流QQ群: 235322432

SpringCloudTutorial交流微信群: 微信沟通群二维码图片链接

欢迎关注,您的肯定是对我最大的支持!!!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70458.html

相关文章

  • SpringCloud 054 简单 Quartz-Cluster 微服务,采用注解配置 Q

    摘要:加载配置文件失败加载配置文件失败添加定时调度任务定时调度任务添加定时调度任务定时调度任务执行的张表入数据库添加启动类简单微服务,采用注解配置分布式集群。 SpringCloud(第 054 篇)简单 Quartz-Cluster 微服务,采用注解配置 Quartz 分布式集群 - 一、大致介绍 1、因网友提到有没有采用注解式配置的Quartz例子,因此本人就贴上了这样一个样例; 2、至...

    isLishude 评论0 收藏0
  • SpringCloud 046 )注解式Schedule配置定时任务,不支持任务调度

    摘要:当前时间打印当前时间定时任务触发,操作多个添加数据,事务中任一异常,都可以正常导致数据回滚。当前时间当前时间添加微服务启动类注解式配置定时任务,不支持任务调度。 SpringCloud(第 046 篇)注解式Schedule配置定时任务,不支持任务调度 - 一、大致介绍 1、很多时候我们需要隔一定的时间去执行某个任务,为了实现这样的需求通常最普通的方式就是利用多线程来实现; 2、但是有...

    masturbator 评论0 收藏0
  • 2021 年最新基于 Spring Cloud 的微服务架构分析

    摘要:是一个相对比较新的微服务框架,年才推出的版本虽然时间最短但是相比等框架提供的全套的分布式系统解决方案。提供线程池不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务器雪崩的问题。通过互相注册的方式来进行消息同步和保证高可用。 Spring Cloud 是一个相对比较新的微服务框架,...

    cikenerd 评论0 收藏0

发表评论

0条评论

xiyang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<