经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring » 查看文章
springboot创建的web项目整合Quartz框架的项目实践
来源:jb51  时间:2022/6/21 10:20:14  对本文有异议

介绍

Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或EJBs。Quartz的最新版本为Quartz 2.3.2。

quartz可以在某一个有规律的时间点干某件事,是一个任务调度框架,可以被集成到java的各种应用中使用,quartz框架可以支持分布式任务处理

基于springboot创建的web项目整合Quartz框架

整体代码结构

在这里插入图片描述

导入依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-quartz</artifactId>
  4. </dependency>

创建quartz_demo数据库,执行tables_mysql_innodb.sql文件创建对应表,下面是文件内容

  1. #
  2. # In your Quartz properties file, you'll need to set
  3. # org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
  4. #
  5. #
  6. # By: Ron Cordell - roncordell
  7. # I didn't see this anywhere, so I thought I'd post it here. This is the script from Quartz to create the tables in a MySQL database, modified to use INNODB instead of MYISAM.
  8.  
  9. DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
  10. DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
  11. DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
  12. DROP TABLE IF EXISTS QRTZ_LOCKS;
  13. DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
  14. DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
  15. DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
  16. DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
  17. DROP TABLE IF EXISTS QRTZ_TRIGGERS;
  18. DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
  19. DROP TABLE IF EXISTS QRTZ_CALENDARS;
  20.  
  21. CREATE TABLE QRTZ_JOB_DETAILS(
  22. SCHED_NAME VARCHAR(120) NOT NULL,
  23. JOB_NAME VARCHAR(190) NOT NULL,
  24. JOB_GROUP VARCHAR(190) NOT NULL,
  25. DESCRIPTION VARCHAR(250) NULL,
  26. JOB_CLASS_NAME VARCHAR(250) NOT NULL,
  27. IS_DURABLE VARCHAR(1) NOT NULL,
  28. IS_NONCONCURRENT VARCHAR(1) NOT NULL,
  29. IS_UPDATE_DATA VARCHAR(1) NOT NULL,
  30. REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
  31. JOB_DATA BLOB NULL,
  32. PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP))
  33. ENGINE=InnoDB;
  34.  
  35. CREATE TABLE QRTZ_TRIGGERS (
  36. SCHED_NAME VARCHAR(120) NOT NULL,
  37. TRIGGER_NAME VARCHAR(190) NOT NULL,
  38. TRIGGER_GROUP VARCHAR(190) NOT NULL,
  39. JOB_NAME VARCHAR(190) NOT NULL,
  40. JOB_GROUP VARCHAR(190) NOT NULL,
  41. DESCRIPTION VARCHAR(250) NULL,
  42. NEXT_FIRE_TIME BIGINT(13) NULL,
  43. PREV_FIRE_TIME BIGINT(13) NULL,
  44. PRIORITY INTEGER NULL,
  45. TRIGGER_STATE VARCHAR(16) NOT NULL,
  46. TRIGGER_TYPE VARCHAR(8) NOT NULL,
  47. START_TIME BIGINT(13) NOT NULL,
  48. END_TIME BIGINT(13) NULL,
  49. CALENDAR_NAME VARCHAR(190) NULL,
  50. MISFIRE_INSTR SMALLINT(2) NULL,
  51. JOB_DATA BLOB NULL,
  52. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
  53. FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
  54. REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP))
  55. ENGINE=InnoDB;
  56.  
  57. CREATE TABLE QRTZ_SIMPLE_TRIGGERS (
  58. SCHED_NAME VARCHAR(120) NOT NULL,
  59. TRIGGER_NAME VARCHAR(190) NOT NULL,
  60. TRIGGER_GROUP VARCHAR(190) NOT NULL,
  61. REPEAT_COUNT BIGINT(7) NOT NULL,
  62. REPEAT_INTERVAL BIGINT(12) NOT NULL,
  63. TIMES_TRIGGERED BIGINT(10) NOT NULL,
  64. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
  65. FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
  66. REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
  67. ENGINE=InnoDB;
  68.  
  69. CREATE TABLE QRTZ_CRON_TRIGGERS (
  70. SCHED_NAME VARCHAR(120) NOT NULL,
  71. TRIGGER_NAME VARCHAR(190) NOT NULL,
  72. TRIGGER_GROUP VARCHAR(190) NOT NULL,
  73. CRON_EXPRESSION VARCHAR(120) NOT NULL,
  74. TIME_ZONE_ID VARCHAR(80),
  75. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
  76. FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
  77. REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
  78. ENGINE=InnoDB;
  79.  
  80. CREATE TABLE QRTZ_SIMPROP_TRIGGERS
  81. (
  82. SCHED_NAME VARCHAR(120) NOT NULL,
  83. TRIGGER_NAME VARCHAR(190) NOT NULL,
  84. TRIGGER_GROUP VARCHAR(190) NOT NULL,
  85. STR_PROP_1 VARCHAR(512) NULL,
  86. STR_PROP_2 VARCHAR(512) NULL,
  87. STR_PROP_3 VARCHAR(512) NULL,
  88. INT_PROP_1 INT NULL,
  89. INT_PROP_2 INT NULL,
  90. LONG_PROP_1 BIGINT NULL,
  91. LONG_PROP_2 BIGINT NULL,
  92. DEC_PROP_1 NUMERIC(13,4) NULL,
  93. DEC_PROP_2 NUMERIC(13,4) NULL,
  94. BOOL_PROP_1 VARCHAR(1) NULL,
  95. BOOL_PROP_2 VARCHAR(1) NULL,
  96. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
  97. FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
  98. REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
  99. ENGINE=InnoDB;
  100.  
  101. CREATE TABLE QRTZ_BLOB_TRIGGERS (
  102. SCHED_NAME VARCHAR(120) NOT NULL,
  103. TRIGGER_NAME VARCHAR(190) NOT NULL,
  104. TRIGGER_GROUP VARCHAR(190) NOT NULL,
  105. BLOB_DATA BLOB NULL,
  106. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
  107. INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP),
  108. FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
  109. REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
  110. ENGINE=InnoDB;
  111.  
  112. CREATE TABLE QRTZ_CALENDARS (
  113. SCHED_NAME VARCHAR(120) NOT NULL,
  114. CALENDAR_NAME VARCHAR(190) NOT NULL,
  115. CALENDAR BLOB NOT NULL,
  116. PRIMARY KEY (SCHED_NAME,CALENDAR_NAME))
  117. ENGINE=InnoDB;
  118.  
  119. CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS (
  120. SCHED_NAME VARCHAR(120) NOT NULL,
  121. TRIGGER_GROUP VARCHAR(190) NOT NULL,
  122. PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP))
  123. ENGINE=InnoDB;
  124.  
  125. CREATE TABLE QRTZ_FIRED_TRIGGERS (
  126. SCHED_NAME VARCHAR(120) NOT NULL,
  127. ENTRY_ID VARCHAR(95) NOT NULL,
  128. TRIGGER_NAME VARCHAR(190) NOT NULL,
  129. TRIGGER_GROUP VARCHAR(190) NOT NULL,
  130. INSTANCE_NAME VARCHAR(190) NOT NULL,
  131. FIRED_TIME BIGINT(13) NOT NULL,
  132. SCHED_TIME BIGINT(13) NOT NULL,
  133. PRIORITY INTEGER NOT NULL,
  134. STATE VARCHAR(16) NOT NULL,
  135. JOB_NAME VARCHAR(190) NULL,
  136. JOB_GROUP VARCHAR(190) NULL,
  137. IS_NONCONCURRENT VARCHAR(1) NULL,
  138. REQUESTS_RECOVERY VARCHAR(1) NULL,
  139. PRIMARY KEY (SCHED_NAME,ENTRY_ID))
  140. ENGINE=InnoDB;
  141.  
  142. CREATE TABLE QRTZ_SCHEDULER_STATE (
  143. SCHED_NAME VARCHAR(120) NOT NULL,
  144. INSTANCE_NAME VARCHAR(190) NOT NULL,
  145. LAST_CHECKIN_TIME BIGINT(13) NOT NULL,
  146. CHECKIN_INTERVAL BIGINT(13) NOT NULL,
  147. PRIMARY KEY (SCHED_NAME,INSTANCE_NAME))
  148. ENGINE=InnoDB;
  149.  
  150. CREATE TABLE QRTZ_LOCKS (
  151. SCHED_NAME VARCHAR(120) NOT NULL,
  152. LOCK_NAME VARCHAR(40) NOT NULL,
  153. PRIMARY KEY (SCHED_NAME,LOCK_NAME))
  154. ENGINE=InnoDB;
  155.  
  156. CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY ON QRTZ_JOB_DETAILS(SCHED_NAME,REQUESTS_RECOVERY);
  157. CREATE INDEX IDX_QRTZ_J_GRP ON QRTZ_JOB_DETAILS(SCHED_NAME,JOB_GROUP);
  158.  
  159. CREATE INDEX IDX_QRTZ_T_J ON QRTZ_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
  160. CREATE INDEX IDX_QRTZ_T_JG ON QRTZ_TRIGGERS(SCHED_NAME,JOB_GROUP);
  161. CREATE INDEX IDX_QRTZ_T_C ON QRTZ_TRIGGERS(SCHED_NAME,CALENDAR_NAME);
  162. CREATE INDEX IDX_QRTZ_T_G ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
  163. CREATE INDEX IDX_QRTZ_T_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE);
  164. CREATE INDEX IDX_QRTZ_T_N_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE);
  165. CREATE INDEX IDX_QRTZ_T_N_G_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE);
  166. CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME ON QRTZ_TRIGGERS(SCHED_NAME,NEXT_FIRE_TIME);
  167. CREATE INDEX IDX_QRTZ_T_NFT_ST ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME);
  168. CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME);
  169. CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE);
  170. CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE);
  171.  
  172. CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME);
  173. CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY);
  174. CREATE INDEX IDX_QRTZ_FT_J_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
  175. CREATE INDEX IDX_QRTZ_FT_JG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_GROUP);
  176. CREATE INDEX IDX_QRTZ_FT_T_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP);
  177. CREATE INDEX IDX_QRTZ_FT_TG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
  178.  
  179. commit;

配置quartz

  1. server:
  2. port: ${PORT:12011}
  3. servlet:
  4. session:
  5. timeout: 86400s # session有效期(xxx秒)
  6. cookie:
  7. http-only: false # 如果为true, 浏览器脚本将无法访问cookie
  8. secure: false # 如果为true, 则仅通过https连接发送cookie, http无法携带cookie
  9. context-path: # 程序上下文路径配置
  10. spring:
  11. application:
  12. name: quartz-demo
  13. aop:
  14. proxy-target-class: true
  15. auto: true
  16. datasource:
  17. url: jdbc:mysql://localhost:3306/quartz_demo
  18. username: root
  19. password: 123456
  20. driver-class-name: com.mysql.jdbc.Driver
  21. # 配置日期格式化
  22. jackson:
  23. date-format: yyyy-MM-dd HH:mm:ss #时间戳统一转换为指定格式
  24. time-zone: GMT+8 # 时区修改为东8区
  25. quartz:
  26. # 将任务等保存化到数据库
  27. job-store-type: jdbc
  28. # 程序结束时会等待quartz相关的内容结束
  29. wait-for-jobs-to-complete-on-shutdown: true
  30. # QuartzScheduler启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录
  31. overwrite-existing-jobs: true
  32. properties:
  33. org:
  34. quartz:
  35. # scheduler相关
  36. scheduler:
  37. # scheduler的实例名
  38. instanceName: scheduler
  39. instanceId: AUTO
  40. # 持久化相关
  41. jobStore:
  42. class: org.quartz.impl.jdbcjobstore.JobStoreTX
  43. driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
  44. # 表示数据库中相关表是QRTZ_开头的
  45. tablePrefix: QRTZ_
  46. useProperties: false
  47. # 配置集群
  48. # 是否加入集群
  49. isClustered: true
  50. # 容许的最大作业延长时间
  51. clusterCheckinInterval: 20000
  52. # 线程池相关
  53. threadPool:
  54. class: org.quartz.simpl.SimpleThreadPool
  55. # 线程数
  56. threadCount: 10
  57. # 线程优先级
  58. threadPriority: 5
  59. threadsInheritContextClassLoaderOfInitializingThread: true
  60. mybatis-plus:
  61. global-config:
  62. db-config:
  63. logic-delete-field: is_deleted
  64. logic-delete-value: 1
  65. logic-not-delete-value: 0
  66. configuration:
  67. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  68. logging:
  69. level:
  70. com.my.quartz: debug

添加sys_job表

  1. CREATE TABLE `sys_job` (
  2. `id` bigint(11) NOT NULL AUTO_INCREMENT,
  3. `job_id` varchar(100) DEFAULT NULL,
  4. `job_name` varchar(255) DEFAULT NULL,
  5. `job_group_name` varchar(255) DEFAULT NULL,
  6. `invoke_target` varchar(255) NOT NULL,
  7. `cron_expression` varchar(50) DEFAULT NULL,
  8. `misfire_policy` varchar(255) DEFAULT NULL COMMENT 'cron计划策略0=默认,1=立即触发执行,2=触发一次执行,3=不触发立即执行',
  9. `status` varchar(10) DEFAULT NULL COMMENT '任务状态(0正常 1暂停)',
  10. `concurrent` varchar(10) DEFAULT NULL COMMENT '是否并发执行(0允许 1禁止)',
  11. PRIMARY KEY (`id`)
  12. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

写两条数据

在这里插入图片描述

依次实现mvc三层

mapper层的xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.my.quartz.boot.mapper.SysJobMapper">
  4. <resultMap id="BaseResultMap" type="com.my.quartz.boot.SysJob">
  5. <id column="id" jdbcType="BIGINT" property="id" />
  6. <result column="job_id" jdbcType="VARCHAR" property="jobId" />
  7. <result column="job_name" jdbcType="VARCHAR" property="jobName" />
  8. <result column="job_group_name" jdbcType="VARCHAR" property="jobGroupName" />
  9. <result column="invoke_target" jdbcType="VARCHAR" property="invokeTarget" />
  10. <result column="cron_expression" jdbcType="VARCHAR" property="cronExpression" />
  11. <result column="misfire_policy" jdbcType="VARCHAR" property="misfirePolicy" />
  12. <result column="status" jdbcType="VARCHAR" property="status" />
  13. <result column="concurrent" jdbcType="VARCHAR" property="concurrent" />
  14. </resultMap>
  15. <sql id="Base_Column_List">
  16. t.id, t.job_id jobId, t.job_name jobName, t.job_group_name jobGroupName, t.invoke_target invokeTarget, t.cron_expression cronExpression, t.misfire_policy misfirePolicy, t.status, t.concurrent
  17. </sql>
  18. </mapper>

mapper接口

  1. /**
  2. * Auto Generated
  3. *
  4. * @author :Boy
  5. * @date :Created in 2022-06-18
  6. * @description:
  7. * @modified By:
  8. */
  9. public interface SysJobMapper extends BaseMapper<SysJob> {
  10.  
  11. }

service接口

  1. public interface SysJobService extends IService<SysJob> {
  2.  
  3. }

service接口实现

  1. @Service
  2. public class SysJobServiceImpl extends ServiceImpl<SysJobMapper, SysJob> implements SysJobService {
  3. @Autowired
  4. private Scheduler scheduler;
  5. @Autowired
  6. private ScheduleUtils scheduleUtils;
  7.  
  8. /**
  9. * 项目启动时,初始化定时器
  10. * 主要是防止手动修改数据库导致未同步到定时任务处理(注:不能手动修改数据库ID和任务组名,否则会导致脏数据)
  11. */
  12. @PostConstruct
  13. public void init() throws SchedulerException, TaskException {
  14. scheduler.clear();
  15. List<SysJob> jobList = baseMapper.selectList(null);
  16. for (SysJob job : jobList) {
  17. scheduleUtils.createScheduleJob(scheduler, job);
  18. }
  19. }
  20. }

controller代码

  1. @RestController
  2. @RequestMapping("/job")
  3. public class SysJobController {
  4. @Resource
  5. private SysJobService sysJobService;
  6. @Resource
  7. private ScheduleUtils scheduleUtils;
  8. @Resource
  9. private Scheduler scheduler;
  10.  
  11. @PostMapping("/add")
  12. public Object add(@RequestBody SysJob entity) throws SchedulerException, TaskException {
  13. sysJobService.save(entity);
  14. scheduleUtils.createScheduleJob(scheduler, entity);
  15. return "ok";
  16. }
  17. }

ScheduleUtils 定时任务工具类

  1. /**
  2. * @Author ScholarTang
  3. * @Date 2021/7/15 下午3:50
  4. * @Desc 定时任务工具类
  5. */
  6. @Component
  7. public class ScheduleUtils {
  8.  
  9. @Autowired
  10. private Scheduler scheduler;
  11.  
  12. /**
  13. * 构建任务触发对象
  14. *
  15. * @param jobName
  16. * @param jobGroup
  17. * @return
  18. */
  19. public TriggerKey getTriggerKey(String jobName, String jobGroup) {
  20. return TriggerKey.triggerKey(jobName, jobGroup);
  21. }
  22.  
  23. /**
  24. * 构建任务键对象
  25. *
  26. * @param jobName
  27. * @param jobGroup
  28. * @return
  29. */
  30. public JobKey getJobKey(String jobName, String jobGroup) {
  31. return JobKey.jobKey(jobName, jobGroup);
  32. }
  33.  
  34. /**
  35. * 创建定时调度任务
  36. *
  37. *
  38. * @param scheduler
  39. * @param job
  40. * @throws SchedulerException
  41. * @throws TaskException
  42. */
  43. public void createScheduleJob(Scheduler scheduler, SysJob job) throws SchedulerException, TaskException {
  44. // 构建job信息
  45. String jobName = job.getJobId() + "_" + job.getJobName();
  46. String jobGroupName = job.getJobGroupName();
  47.  
  48. //TODO 反射动态获取Job实现类
  49. //构建job实例
  50. JobDetail jobDetail = JobBuilder.newJob(QuartzJobImpl.class)
  51. .withIdentity(getJobKey(jobName, jobGroupName))
  52. .build();
  53. jobDetail.getJobDataMap().put("QuartzJobExecutionData", job);
  54. // 表达式调度构建器
  55. CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression());
  56. cronScheduleBuilder = handleCronScheduleMisfirePolicy(job, cronScheduleBuilder);
  57.  
  58. // 按新的cronExpression表达式构建一个新的trigger
  59. CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(jobName, jobGroupName))
  60. .withSchedule(cronScheduleBuilder).build();
  61.  
  62. // 放入参数,运行时的方法可以获取
  63. jobDetail.getJobDataMap().put("QuartzJobExecutionData", job);
  64.  
  65. // 判断是否存在
  66. if (scheduler.checkExists(getJobKey(jobName, jobGroupName))) {
  67. // 防止创建时存在数据问题 先移除,然后在执行创建操作
  68. scheduler.deleteJob(getJobKey(jobName, jobGroupName));
  69. }
  70.  
  71. //创建定时任务调度
  72. scheduler.scheduleJob(jobDetail, trigger);
  73.  
  74. // 暂停任务 规定 0启动 1暂停
  75. if (job.getStatus().equals("1")) {
  76. scheduler.pauseJob(getJobKey(jobName, jobGroupName));
  77. }
  78. }
  79.  
  80.  
  81. /**
  82. * 删除定时调度任务
  83. *
  84. * @param sysJob
  85. * @throws SchedulerException
  86. */
  87. public void deleteScheduleJob(SysJob sysJob) throws SchedulerException {
  88. scheduler.deleteJob(getJobKey(sysJob.getJobId() + "_" + sysJob.getJobName(), sysJob.getJobGroupName()));
  89. }
  90.  
  91.  
  92. /**
  93. * 设置定时任务策略
  94. *
  95. * @param sysJob
  96. * @param cronScheduleBuilder
  97. * @return
  98. */
  99. public CronScheduleBuilder handleCronScheduleMisfirePolicy(SysJob sysJob, CronScheduleBuilder cronScheduleBuilder) throws TaskException {
  100. switch (sysJob.getMisfirePolicy()) {
  101. case "0":
  102. return cronScheduleBuilder;
  103. case "1":
  104. return cronScheduleBuilder.withMisfireHandlingInstructionIgnoreMisfires();
  105. case "2":
  106. return cronScheduleBuilder.withMisfireHandlingInstructionFireAndProceed();
  107. case "3":
  108. return cronScheduleBuilder.withMisfireHandlingInstructionDoNothing();
  109. default:
  110. throw new TaskException("任务失败策略 '" + sysJob.getMisfirePolicy()
  111. + "' 不能在cron计划任务中使用", TaskException.Code.CONFIG_ERROR);
  112. }
  113. }
  114. }

创建一个Job实现类,只是一个简单实现类,没有对方法添加参数

  1. @Slf4j
  2. @Component
  3. public class QuartzJobImpl implements Job {
  4.  
  5. @Autowired
  6. private ApplicationContext context;
  7.  
  8. @SneakyThrows
  9. @Override
  10. public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
  11. SysJob sysJob = new SysJob();
  12. BeanUtils.copyProperties(jobExecutionContext.getMergedJobDataMap().get("QuartzJobExecutionData"), sysJob);
  13. log.info("正在执行任务");
  14. String invokeTarget = sysJob.getInvokeTarget();
  15. String beanName = invokeTarget.split("\\.")[0];
  16. String methodName = invokeTarget.split("\\.")[1];
  17. Object bean = context.getBean(beanName);
  18. Class<?> clazz = bean.getClass();
  19. Method method = clazz.getMethod(methodName);
  20. method.invoke(bean);
  21. log.info("已结束任务");
  22. System.out.println();
  23. }
  24. }

创建最终任务执行类,执行函数级别的定时任务,数据库中的invoke_target是和这里放入spring中的名称相同的,quartz_target.hello最终执行的函数就是hello函数

  1. @Slf4j
  2. @Component("quartz_target")
  3. public class QuartzJobExe {
  4.  
  5. @Resource
  6. private Scheduler scheduler;
  7.  
  8. public void hello() throws Exception {
  9. System.out.println("[job]实例执行...hello..." + System.currentTimeMillis());
  10. }
  11.  
  12. public void action() throws Exception {
  13. System.out.println("[job]实例执行...action..." + System.currentTimeMillis());
  14. }
  15. }

最终代码结构

在这里插入图片描述

启动spring boot之后的任务状态

在这里插入图片描述

使用postman工具类添加一个任务

在这里插入图片描述

然后在代码中添加一个对应的方法

在这里插入图片描述

重新启动springboot的运行结果

在这里插入图片描述

理论上使用这样的反射方式可以运行任何代码的

 到此这篇关于springboot创建的web项目整合Quartz框架的项目实践的文章就介绍到这了,更多相关springboot整合Quartz框架内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号