• SpringBoot整合Quartz示例


    数据表  加不加无所谓,如果需要重启服务器后重新执行所有JOB就把sql加上

    如果不加表  将application.properties中的quartz数据库配置去掉 

    自己执行自己的逻辑来就好,大不了每次启动之后重新加载自己的逻辑

    链接:https://pan.baidu.com/s/1KqOPYMfI4eHcEMxt5BmtYg 
    提取码:o9ql 
    --来自百度网盘超级会员V4的分享

    SpringBoot工程

    pom依赖

    1. <dependencies>
    2. <dependency>
    3. <groupId>com.alibaba</groupId>
    4. <artifactId>fastjson</artifactId>
    5. <version>2.0.26</version>
    6. </dependency>
    7. <dependency>
    8. <groupId>org.springframework.boot</groupId>
    9. <artifactId>spring-boot-starter-web</artifactId>
    10. </dependency>
    11. <dependency>
    12. <groupId>com.baomidou</groupId>
    13. <artifactId>mybatis-plus-boot-starter</artifactId>
    14. <version>3.4.3</version>
    15. </dependency>
    16. <dependency>
    17. <groupId>com.alibaba</groupId>
    18. <artifactId>druid-spring-boot-starter</artifactId>
    19. <version>1.2.16</version>
    20. </dependency>
    21. <dependency>
    22. <groupId>mysql</groupId>
    23. <artifactId>mysql-connector-java</artifactId>
    24. <scope>runtime</scope>
    25. </dependency>
    26. <dependency>
    27. <groupId>org.projectlombok</groupId>
    28. <artifactId>lombok</artifactId>
    29. <optional>true</optional>
    30. </dependency>
    31. <dependency>
    32. <groupId>org.springframework.boot</groupId>
    33. <artifactId>spring-boot-starter-test</artifactId>
    34. <scope>test</scope>
    35. </dependency>
    36. <!-- <dependency>-->
    37. <!-- <groupId>org.springframework.boot</groupId>-->
    38. <!-- <artifactId>spring-boot-devtools</artifactId>-->
    39. <!-- </dependency>-->
    40. <!--解决加了@ConfigurationProperties注解 类上的提示-->
    41. <dependency>
    42. <groupId>org.springframework.boot</groupId>
    43. <artifactId>spring-boot-configuration-processor</artifactId>
    44. </dependency>
    45. <dependency>
    46. <groupId>org.springframework.boot</groupId>
    47. <artifactId>spring-boot-starter-quartz</artifactId>
    48. </dependency>
    49. <dependency>
    50. <groupId>org.projectlombok</groupId>
    51. <artifactId>lombok</artifactId>
    52. <optional>true</optional>
    53. </dependency>
    54. <dependency>
    55. <groupId>org.springframework.boot</groupId>
    56. <artifactId>spring-boot-starter-test</artifactId>
    57. <scope>test</scope>
    58. </dependency>
    59. </dependencies>
    60. <build>
    61. <plugins>
    62. <plugin>
    63. <groupId>org.springframework.boot</groupId>
    64. <artifactId>spring-boot-maven-plugin</artifactId>
    65. <configuration>
    66. <image>
    67. <builder>paketobuildpacks/builder-jammy-base:latest</builder>
    68. </image>
    69. <excludes>
    70. <exclude>
    71. <groupId>org.projectlombok</groupId>
    72. <artifactId>lombok</artifactId>
    73. </exclude>
    74. </excludes>
    75. </configuration>
    76. </plugin>
    77. </plugins>
    78. </build>

    application.properties

    1. spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    2. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    3. spring.datasource.url=jdbc:mysql://localhost:3306/job3?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF8&useSSL=false&rewriteBatchedStatements=true
    4. spring.datasource.username=root
    5. spring.datasource.password=123456
    6. #
    7. #
    8. #
    9. #mybatis-plus.configuration.map-underscore-to-camel-case=true
    10. #
    11. #mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
    12. #
    13. #
    14. #mybatis-plus.global-config.db-config.table-prefix=tbl_
    15. #
    16. #
    17. #mybatis-plus.global-config.db-config.id-type=auto
    18. # 定时任务Quartz的数据源配置
    19. spring.quartz.properties.org.quartz.dataSource.globalJobDataSource.URL=jdbc:mysql://localhost:3306/job3?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false
    20. spring.quartz.properties.org.quartz.dataSource.globalJobDataSource.driver=com.mysql.cj.jdbc.Driver
    21. spring.quartz.properties.org.quartz.dataSource.globalJobDataSource.maxConnections=5
    22. spring.quartz.properties.org.quartz.dataSource.globalJobDataSource.username=root
    23. spring.quartz.properties.org.quartz.dataSource.globalJobDataSource.password=123456
    24. spring.quartz.properties.org.quartz.dataSource.globalJobDataSource.provider=hikaricp
    25. # Quartz调度器配置
    26. spring.quartz.properties.org.quartz.scheduler.instanceName=globalScheduler
    27. spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
    28. spring.quartz.properties.org.quartz.scheduler.type=com.alibaba.druid.pool.DruidDataSource
    29. # Quartz作业存储配置
    30. spring.quartz.properties.org.quartz.jobStore.dataSource=globalJobDataSource
    31. spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
    32. spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
    33. spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
    34. spring.quartz.properties.org.quartz.jobStore.misfireThreshold=100
    35. spring.quartz.properties.org.quartz.jobStore.isClustered=true
    36. # Quartz线程池配置
    37. spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
    38. spring.quartz.properties.org.quartz.threadPool.threadCount=10
    39. spring.quartz.properties.org.quartz.threadPool.threadPriority=5

    包结构

    实体类

    1. package com.example.springbootquartz.pojo;
    2. import lombok.AllArgsConstructor;
    3. import lombok.Data;
    4. import lombok.NoArgsConstructor;
    5. import lombok.experimental.Accessors;
    6. /**
    7. * @author hrui
    8. * @date 2023/11/16 22:57
    9. */
    10. @Data
    11. @NoArgsConstructor
    12. @AllArgsConstructor
    13. @Accessors(chain = true)
    14. public class JobInfo {
    15. /**
    16. * 任务名称
    17. */
    18. private String jobName;
    19. /**
    20. * 任务组
    21. */
    22. private String jobGroup;
    23. /**
    24. * 触发器名称
    25. */
    26. private String triggerName;
    27. /**
    28. * 触发器组
    29. */
    30. private String triggerGroup;
    31. /**
    32. * cron表达式
    33. */
    34. private String cron;
    35. /**
    36. * 类名
    37. */
    38. private String className;
    39. /**
    40. * 状态
    41. */
    42. private String status;
    43. /**
    44. * 下一次执行时间
    45. */
    46. private String nextTime;
    47. /**
    48. * 上一次执行时间
    49. */
    50. private String prevTime;
    51. /**
    52. * 配置信息(data)
    53. */
    54. private String config;
    55. }
    1. package com.example.springbootquartz.job;
    2. import com.alibaba.fastjson.JSONObject;
    3. import com.example.springbootquartz.pojo.JobInfo;
    4. import org.quartz.*;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.stereotype.Component;
    7. import javax.annotation.Resource;
    8. import java.util.List;
    9. import java.util.Objects;
    10. /**
    11. * @author hrui
    12. * @date 2023/11/16 23:10
    13. */
    14. @Component
    15. public class SchedulerManage {
    16. @Autowired
    17. private Scheduler scheduler;
    18. /**
    19. * 添加任务
    20. */
    21. @SuppressWarnings("unchecked")
    22. public void addJob(JobInfo jobInfo) throws SchedulerException, ClassNotFoundException {
    23. Objects.requireNonNull(jobInfo, "任务信息不能为空");
    24. // 生成job key
    25. JobKey jobKey = JobKey.jobKey(jobInfo.getJobName(), jobInfo.getJobGroup());
    26. // 当前任务不存在才进行添加
    27. if (!scheduler.checkExists(jobKey)) {
    28. Class<Job> jobClass = (Class<Job>)Class.forName(jobInfo.getClassName());
    29. // 任务明细
    30. JobDetail jobDetail = JobBuilder
    31. .newJob(jobClass)
    32. .withIdentity(jobKey)
    33. .withIdentity(jobInfo.getJobName(), jobInfo.getJobGroup())
    34. .withDescription(jobInfo.getJobName())
    35. .build();
    36. // 配置信息
    37. jobDetail.getJobDataMap().put("config", jobInfo.getConfig());
    38. // 定义触发器
    39. TriggerKey triggerKey = TriggerKey.triggerKey(jobInfo.getTriggerName(), jobInfo.getTriggerGroup());
    40. // 设置任务的触发机制
    41. Trigger trigger = TriggerBuilder.newTrigger()
    42. .withIdentity(triggerKey)
    43. .withSchedule(CronScheduleBuilder.cronSchedule(jobInfo.getCron()).withMisfireHandlingInstructionDoNothing())
    44. .build();
    45. scheduler.scheduleJob(jobDetail, trigger);
    46. } else {
    47. throw new SchedulerException(jobInfo.getJobName() + "任务已存在,无需重复添加");
    48. }
    49. }
    50. /**
    51. * 任务暂停
    52. */
    53. public void pauseJob(String jobGroup, String jobName) throws SchedulerException {
    54. JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
    55. if (scheduler.checkExists(jobKey)) {
    56. scheduler.pauseJob(jobKey);
    57. }
    58. }
    59. /**
    60. * 继续任务
    61. */
    62. public void continueJob(String jobGroup, String jobName) throws SchedulerException {
    63. JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
    64. if (scheduler.checkExists(jobKey)) {
    65. scheduler.resumeJob(jobKey);
    66. }
    67. }
    68. /**
    69. * 删除任务
    70. */
    71. public boolean deleteJob(String jobGroup, String jobName) throws SchedulerException {
    72. JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
    73. if (scheduler.checkExists(jobKey)) {
    74. // 这里还需要先删除trigger相关
    75. //TriggerKey triggerKey = TriggerKey.triggerKey(jobInfo.getTriggerName(), jobInfo.getTriggerGroup());
    76. //scheduler.getTrigger()
    77. //scheduler.rescheduleJob()
    78. return scheduler.deleteJob(jobKey);//不需要删除trigger 一个job可以有多个trigger 删除job同时源码底层会删除对应trigger
    79. }
    80. return false;
    81. }
    82. /**
    83. * 获取任务信息
    84. */
    85. public JobInfo getJobInfo(String jobGroup, String jobName) throws SchedulerException {
    86. JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
    87. if (!scheduler.checkExists(jobKey)) {
    88. return null;
    89. }
    90. List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
    91. if (Objects.isNull(triggers)) {
    92. throw new SchedulerException("未获取到触发器信息");
    93. }
    94. TriggerKey triggerKey = triggers.get(0).getKey();
    95. Trigger.TriggerState triggerState = scheduler.getTriggerState(triggerKey);
    96. JobDetail jobDetail = scheduler.getJobDetail(jobKey);
    97. JobInfo jobInfo = new JobInfo();
    98. jobInfo.setJobName(jobGroup);
    99. jobInfo.setJobGroup(jobName);
    100. jobInfo.setTriggerName(triggerKey.getName());
    101. jobInfo.setTriggerGroup(triggerKey.getGroup());
    102. jobInfo.setClassName(jobDetail.getJobClass().getName());
    103. jobInfo.setStatus(triggerState.toString());
    104. if (Objects.nonNull(jobDetail.getJobDataMap())) {
    105. jobInfo.setConfig(JSONObject.toJSONString(jobDetail.getJobDataMap()));
    106. }
    107. CronTrigger theTrigger = (CronTrigger) triggers.get(0);
    108. jobInfo.setCron(theTrigger.getCronExpression());
    109. return jobInfo;
    110. }
    111. }

    1. package com.example.springbootquartz.job;
    2. import org.quartz.DisallowConcurrentExecution;
    3. import org.quartz.JobExecutionContext;
    4. import org.quartz.PersistJobDataAfterExecution;
    5. import org.springframework.boot.context.properties.ConfigurationProperties;
    6. import org.springframework.scheduling.quartz.QuartzJobBean;
    7. import java.text.DateFormat;
    8. import java.text.SimpleDateFormat;
    9. import java.time.LocalDateTime;
    10. import java.util.Date;
    11. /**
    12. * @author hrui
    13. * @date 2023/11/16 22:58
    14. */
    15. @DisallowConcurrentExecution//避免并发执行
    16. @PersistJobDataAfterExecution//Job状态
    17. public class QuartzJob1 extends QuartzJobBean {
    18. @Override
    19. protected void executeInternal(JobExecutionContext context) {
    20. System.out.println("QuartzJob1正在执行..."+getTime());
    21. }
    22. private String getTime(){
    23. DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss:SSS");
    24. return dateFormat.format(new Date());
    25. }
    26. }

    控制器

    1. package com.example.springbootquartz.controller;
    2. import com.example.springbootquartz.job.SchedulerManage;
    3. import com.example.springbootquartz.pojo.JobInfo;
    4. import org.quartz.*;
    5. import org.quartz.impl.StdScheduler;
    6. import org.quartz.impl.matchers.GroupMatcher;
    7. import org.springframework.beans.factory.annotation.Autowired;
    8. import org.springframework.scheduling.quartz.SchedulerFactoryBean;
    9. import org.springframework.web.bind.annotation.*;
    10. import javax.annotation.Resource;
    11. import java.util.ArrayList;
    12. import java.util.List;
    13. import java.util.Set;
    14. /**
    15. * @author hrui
    16. * @date 2023/11/16 23:13
    17. */
    18. @RestController
    19. @RequestMapping("/job")
    20. public class QuartzController {
    21. @Autowired
    22. private SchedulerManage schedulerManage;
    23. @Autowired
    24. private Scheduler scheduler;
    25. //StdScheduler
    26. @Autowired
    27. private SchedulerFactoryBean SchedulerFactoryBean;
    28. /**
    29. * 查询所有的任务
    30. */
    31. @RequestMapping("/all")
    32. public List list() throws SchedulerException {
    33. List jobInfos = new ArrayList<>();
    34. List triggerGroupNames = scheduler.getTriggerGroupNames();
    35. for (String triggerGroupName : triggerGroupNames) {
    36. Set triggerKeySet = scheduler
    37. .getTriggerKeys(GroupMatcher.triggerGroupEquals(triggerGroupName));
    38. for (TriggerKey triggerKey : triggerKeySet) {
    39. Trigger trigger = scheduler.getTrigger(triggerKey);
    40. JobKey jobKey = trigger.getJobKey();
    41. JobInfo jobInfo = schedulerManage.getJobInfo(jobKey.getGroup(), jobKey.getName());
    42. jobInfos.add(jobInfo);
    43. }
    44. }
    45. return jobInfos;
    46. }
    47. /**
    48. * 添加任务
    49. */
    50. @PostMapping("/add")
    51. public JobInfo addJob(@RequestBody JobInfo jobInfo) throws SchedulerException, ClassNotFoundException {
    52. schedulerManage.addJob(jobInfo);
    53. return jobInfo;
    54. }
    55. /**
    56. * 暂停任务
    57. */
    58. @RequestMapping("/pause")
    59. public void pauseJob(@RequestParam("jobGroup") String jobGroup, @RequestParam("jobName") String jobName)
    60. throws SchedulerException {
    61. schedulerManage.pauseJob(jobGroup, jobName);
    62. }
    63. /**
    64. * 继续任务
    65. */
    66. @RequestMapping("/continue")
    67. public void continueJob(@RequestParam("jobGroup") String jobGroup, @RequestParam("jobName") String jobName)
    68. throws SchedulerException {
    69. schedulerManage.continueJob(jobGroup, jobName);
    70. }
    71. /**
    72. * 删除任务
    73. */
    74. @RequestMapping("/delete")
    75. public boolean deleteJob(@RequestParam("jobGroup") String jobGroup, @RequestParam("jobName") String jobName)
    76. throws SchedulerException {
    77. return schedulerManage.deleteJob(jobGroup, jobName);
    78. }
    79. }

    {

        "jobName":"job1",

        "jobGroup":"group1",

        "triggerName":"trigger1",

        "triggerGroup":"tGroup1",

        "cron":"*/5 * * * * ?",

        "className":"com.example.springbootquartz.job.QuartzJob1"

    }

  • 相关阅读:
    电脑技巧:Win7、Win10、Win11如何选择,看完你就懂了
    GoLang设计模式21 - 装饰模式
    Qt实战案例(55)——利用QDir删除选定文件目录下的空文件夹
    Python Wordcloud报错:Only supported for TrueType fonts,多种解决方案
    (经验贴)怎么对HTML文件进行分析
    Java学习笔记——Iterator
    Kafka学习之:mac 上基础使用 python 来使用 kafka 的生产者和消费者进行数据处理
    这8种算法——程序员必会
    Java基础实现加油站圈存机系统
    Kata3.0.0 x LifseaOS x 龙蜥内核三管齐下!带你体验最新的安全容器之旅
  • 原文地址:https://blog.csdn.net/tiantiantbtb/article/details/134454167