Quartz---Springboot项目整合Quartz---实现内存、数据库持久化 ...

打印 上一主题 下一主题

主题 1003|帖子 1003|积分 3009

1.SpringBoot整合Quartz使用内存持久化

1.1.什么是内存持久化

   Quartz的内存持久化是指Quartz框架在默认环境下将任务调理的运行信息保存在内存中。这种方式的优点是可以提供最佳的性能,因为内存中数据访问最快。然而,内存持久化的缺点是缺乏数据的持久性。当程序制止或系统崩溃时,所有运行的信息都会丢失。
  1.2.步调如下

1.2.1. 添加依靠


起首,在pom.xml文件中添加Quartz的依靠项。
  1. <dependency>  
  2.     <groupId>org.springframework.boot</groupId>  
  3.     <artifactId>spring-boot-starter-quartz</artifactId>  
  4. </dependency>
复制代码

 
1.2.2. 创建Job类


实现org.quartz.Job接口或org.quartz.StatefulJob接口,并覆盖execute方法。
  1. import org.quartz.Job;  
  2. import org.quartz.JobExecutionContext;  
  3. import org.quartz.JobExecutionException;  
  4.   
  5. public class MyJob implements Job {  
  6.     @Override  
  7.     public void execute(JobExecutionContext context) throws JobExecutionException {  
  8.         // 执行作业逻辑  
  9.     }  
  10. }
复制代码
1.2.3. 创建JobDetail和Trigger


使用JobBuilder和TriggerBuilder来创建JobDetail和Trigger实例,并通过调理器将它们关联起来。
  1. import org.quartz.*;  
  2. import org.springframework.context.annotation.Bean;  
  3. import org.springframework.context.annotation.Configuration;  
  4.   
  5. @Configuration  
  6. public class QuartzConfig {  
  7.     //创建JobDetailr实例
  8.     @Bean  
  9.     public JobDetail myJobDetail() {  
  10.         return JobBuilder.newJob(MyJob.class)  
  11.                 .withIdentity("myJob", "group1")  
  12.                 .storeDurably()  
  13.                 .build();  
  14.     }  
  15.     //创建调度器和Trigge并管理jobDetail
  16.     @Bean  
  17.     public Trigger myTrigger() {  
  18.         SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()  
  19.                 .withIntervalInSeconds(5)  //每5秒执行一次任务
  20.                 .repeatForever();  
  21.   
  22.         return TriggerBuilder.newTrigger()  
  23.                 .forJob(myJobDetail())  
  24.                 .withIdentity("myTrigger", "group1")  
  25.                 .withSchedule(scheduleBuilder)  
  26.                 .build();  
  27.     }  
  28. }
复制代码
1.2.4. 启动应用


运行你的Spring Boot应用,Quartz将会根据配置主动启动,并按照你定义的Trigger来触发并执行作业。
1.2.实例

   定时执行任务,查找数据库中预约时间过期的数据并将车位状态实时更新。
  1.2.1数据库数据说明

预约记录表单


车位表单中的id作为预约表单的外键


1.2.2.关键代码

对job类进行修改
  1. package com.duhong.quartz;
  2. import com.duhong.entity.OrderParking;
  3. import com.duhong.service.OrderService;
  4. import org.quartz.*;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.boot.autoconfigure.batch.BatchProperties;
  7. import org.springframework.boot.autoconfigure.quartz.QuartzDataSource;
  8. import org.springframework.context.annotation.Configuration;
  9. import org.springframework.stereotype.Component;
  10. import java.time.LocalDateTime;
  11. import java.util.List;
  12. @PersistJobDataAfterExecution
  13. @DisallowConcurrentExecution
  14. public class UpdateJob implements Job {
  15.     @Autowired
  16.     OrderService orderService;
  17.     @Override
  18.     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
  19.          //查询所有预约记录
  20.         List<OrderParking> orderParkings = orderService.selectRecord();
  21.         for (OrderParking orderParking : orderParkings) {
  22.             System.out.println("作业执行");
  23.             System.out.println("到期时间"+orderParking.getDeadtime());
  24.             System.out.println("当前时间"+LocalDateTime.now());
  25.             //未到预约时间
  26.             if(orderParking.getDeadtime().isBefore( LocalDateTime.now())){
  27.                 //更新车位状态
  28.                 orderService.updateInitStatus(orderParking.getId());
  29.                 System.out.println("更新成功");
  30.             }else{
  31.                 System.out.println("未到预约时间");
  32.             }
  33.         }
  34.     }
  35. }
复制代码
1.2.3.执行结果





2.SpringBoot整合Quartz使用mysql持久化

2.1.为啥要使用数据库持久化

   Quartz 是一个开源的任务调理框架,用于在 Java 应用中执行定时任务。Quartz 自己不直接提供任务持久化的功能,但它支持将任务、触发器和其他相关信息存储到数据库中,以便在应用程序重启或服务器崩溃后恢复。
  选择 MySQL 作为 Quartz 的持久化存储有以下几个缘故原由:
  

  • 通用性和普及性:MySQL 是一个广泛使用的开源关系型数据库管理系统,具有很高的通用性和普及性。许多开发者和团队都认识 MySQL,因此选择 MySQL 作为 Quartz 的持久化存储可以简化开发和维护过程。
  • 稳定性和可靠性:MySQL 是一个成熟、稳定且经过广泛验证的数据库系统。它提供了良好的数据完整性和可靠性保证,可以确保 Quartz 任务调理的准确性和一致性。
  • 性能优化:MySQL 在处理大量数据和复杂查询方面体现精彩。通过合理的索引和查询优化,可以确保 Quartz 在持久化任务时具有良好的性能体现。
  • 社区支持和资源:由于 MySQL 的广泛使用和开源性子,它拥有庞大的用户社区和丰富的资源。这意味着在碰到题目时,可以更容易地找到解决方案或获得帮助。
  • 扩展性和灵活性:MySQL 支持多种存储引擎和配置选项,可以根据实际需求进行灵活的配置和扩展。这使得它成为一个得当各种规模应用程序的持久化存储选择。
  2.2.持久化步调

基于对quartz使用内存持久化,我们只需添加数据库表及修改properities文件即可
2.2.1.添加数据库表

  1. create table if not exists parking_place
  2. (
  3.    id int auto_increment
  4.       primary key,
  5.    location varchar(255) null,
  6.    status int default 0 null,
  7.    price double null,
  8.    type varchar(255) null
  9. );
  10. create table if not exists qrtz_calendars
  11. (
  12.    SCHED_NAME varchar(120) not null,
  13.    CALENDAR_NAME varchar(190) not null,
  14.    CALENDAR blob not null,
  15.    primary key (SCHED_NAME, CALENDAR_NAME)
  16. );
  17. create table if not exists qrtz_fired_triggers
  18. (
  19.    SCHED_NAME varchar(120) not null,
  20.    ENTRY_ID varchar(95) not null,
  21.    TRIGGER_NAME varchar(190) not null,
  22.    TRIGGER_GROUP varchar(190) not null,
  23.    INSTANCE_NAME varchar(190) not null,
  24.    FIRED_TIME bigint(13) not null,
  25.    SCHED_TIME bigint(13) not null,
  26.    PRIORITY int not null,
  27.    STATE varchar(16) not null,
  28.    JOB_NAME varchar(190) null,
  29.    JOB_GROUP varchar(190) null,
  30.    IS_NONCONCURRENT varchar(1) null,
  31.    REQUESTS_RECOVERY varchar(1) null,
  32.    primary key (SCHED_NAME, ENTRY_ID)
  33. );
  34. create index IDX_QRTZ_FT_INST_JOB_REQ_RCVRY
  35.    on qrtz_fired_triggers (SCHED_NAME, INSTANCE_NAME, REQUESTS_RECOVERY);
  36. create index IDX_QRTZ_FT_JG
  37.    on qrtz_fired_triggers (SCHED_NAME, JOB_GROUP);
  38. create index IDX_QRTZ_FT_J_G
  39.    on qrtz_fired_triggers (SCHED_NAME, JOB_NAME, JOB_GROUP);
  40. create index IDX_QRTZ_FT_TG
  41.    on qrtz_fired_triggers (SCHED_NAME, TRIGGER_GROUP);
  42. create index IDX_QRTZ_FT_TRIG_INST_NAME
  43.    on qrtz_fired_triggers (SCHED_NAME, INSTANCE_NAME);
  44. create index IDX_QRTZ_FT_T_G
  45.    on qrtz_fired_triggers (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP);
  46. create table if not exists qrtz_job_details
  47. (
  48.    SCHED_NAME varchar(120) not null,
  49.    JOB_NAME varchar(190) not null,
  50.    JOB_GROUP varchar(190) not null,
  51.    DESCRIPTION varchar(250) null,
  52.    JOB_CLASS_NAME varchar(250) not null,
  53.    IS_DURABLE varchar(1) not null,
  54.    IS_NONCONCURRENT varchar(1) not null,
  55.    IS_UPDATE_DATA varchar(1) not null,
  56.    REQUESTS_RECOVERY varchar(1) not null,
  57.    JOB_DATA blob null,
  58.    primary key (SCHED_NAME, JOB_NAME, JOB_GROUP)
  59. );
  60. create index IDX_QRTZ_J_GRP
  61.    on qrtz_job_details (SCHED_NAME, JOB_GROUP);
  62. create index IDX_QRTZ_J_REQ_RECOVERY
  63.    on qrtz_job_details (SCHED_NAME, REQUESTS_RECOVERY);
  64. create table if not exists qrtz_locks
  65. (
  66.    SCHED_NAME varchar(120) not null,
  67.    LOCK_NAME varchar(40) not null,
  68.    primary key (SCHED_NAME, LOCK_NAME)
  69. );
  70. create table if not exists qrtz_paused_trigger_grps
  71. (
  72.    SCHED_NAME varchar(120) not null,
  73.    TRIGGER_GROUP varchar(190) not null,
  74.    primary key (SCHED_NAME, TRIGGER_GROUP)
  75. );
  76. create table if not exists qrtz_scheduler_state
  77. (
  78.    SCHED_NAME varchar(120) not null,
  79.    INSTANCE_NAME varchar(190) not null,
  80.    LAST_CHECKIN_TIME bigint(13) not null,
  81.    CHECKIN_INTERVAL bigint(13) not null,
  82.    primary key (SCHED_NAME, INSTANCE_NAME)
  83. );
  84. create table if not exists qrtz_triggers
  85. (
  86.    SCHED_NAME varchar(120) not null,
  87.    TRIGGER_NAME varchar(190) not null,
  88.    TRIGGER_GROUP varchar(190) not null,
  89.    JOB_NAME varchar(190) not null,
  90.    JOB_GROUP varchar(190) not null,
  91.    DESCRIPTION varchar(250) null,
  92.    NEXT_FIRE_TIME bigint(13) null,
  93.    PREV_FIRE_TIME bigint(13) null,
  94.    PRIORITY int null,
  95.    TRIGGER_STATE varchar(16) not null,
  96.    TRIGGER_TYPE varchar(8) not null,
  97.    START_TIME bigint(13) not null,
  98.    END_TIME bigint(13) null,
  99.    CALENDAR_NAME varchar(190) null,
  100.    MISFIRE_INSTR smallint(2) null,
  101.    JOB_DATA blob null,
  102.    primary key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
  103.    constraint qrtz_triggers_ibfk_1
  104.       foreign key (SCHED_NAME, JOB_NAME, JOB_GROUP) references qrtz_job_details (SCHED_NAME, JOB_NAME, JOB_GROUP)
  105. );
  106. create table if not exists qrtz_blob_triggers
  107. (
  108.    SCHED_NAME varchar(120) not null,
  109.    TRIGGER_NAME varchar(190) not null,
  110.    TRIGGER_GROUP varchar(190) not null,
  111.    BLOB_DATA blob null,
  112.    primary key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
  113.    constraint qrtz_blob_triggers_ibfk_1
  114.       foreign key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) references qrtz_triggers (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
  115. );
  116. create index SCHED_NAME
  117.    on qrtz_blob_triggers (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP);
  118. create table if not exists qrtz_cron_triggers
  119. (
  120.    SCHED_NAME varchar(120) not null,
  121.    TRIGGER_NAME varchar(190) not null,
  122.    TRIGGER_GROUP varchar(190) not null,
  123.    CRON_EXPRESSION varchar(120) not null,
  124.    TIME_ZONE_ID varchar(80) null,
  125.    primary key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
  126.    constraint qrtz_cron_triggers_ibfk_1
  127.       foreign key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) references qrtz_triggers (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
  128. );
  129. create table if not exists qrtz_simple_triggers
  130. (
  131.    SCHED_NAME varchar(120) not null,
  132.    TRIGGER_NAME varchar(190) not null,
  133.    TRIGGER_GROUP varchar(190) not null,
  134.    REPEAT_COUNT bigint(7) not null,
  135.    REPEAT_INTERVAL bigint(12) not null,
  136.    TIMES_TRIGGERED bigint(10) not null,
  137.    primary key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
  138.    constraint qrtz_simple_triggers_ibfk_1
  139.       foreign key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) references qrtz_triggers (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
  140. );
  141. create table if not exists qrtz_simprop_triggers
  142. (
  143.    SCHED_NAME varchar(120) not null,
  144.    TRIGGER_NAME varchar(190) not null,
  145.    TRIGGER_GROUP varchar(190) not null,
  146.    STR_PROP_1 varchar(512) null,
  147.    STR_PROP_2 varchar(512) null,
  148.    STR_PROP_3 varchar(512) null,
  149.    INT_PROP_1 int null,
  150.    INT_PROP_2 int null,
  151.    LONG_PROP_1 bigint null,
  152.    LONG_PROP_2 bigint null,
  153.    DEC_PROP_1 decimal(13,4) null,
  154.    DEC_PROP_2 decimal(13,4) null,
  155.    BOOL_PROP_1 varchar(1) null,
  156.    BOOL_PROP_2 varchar(1) null,
  157.    primary key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
  158.    constraint qrtz_simprop_triggers_ibfk_1
  159.       foreign key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) references qrtz_triggers (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
  160. );
  161. create index IDX_QRTZ_T_C
  162.    on qrtz_triggers (SCHED_NAME, CALENDAR_NAME);
  163. create index IDX_QRTZ_T_G
  164.    on qrtz_triggers (SCHED_NAME, TRIGGER_GROUP);
  165. create index IDX_QRTZ_T_J
  166.    on qrtz_triggers (SCHED_NAME, JOB_NAME, JOB_GROUP);
  167. create index IDX_QRTZ_T_JG
  168.    on qrtz_triggers (SCHED_NAME, JOB_GROUP);
  169. create index IDX_QRTZ_T_NEXT_FIRE_TIME
  170.    on qrtz_triggers (SCHED_NAME, NEXT_FIRE_TIME);
  171. create index IDX_QRTZ_T_NFT_MISFIRE
  172.    on qrtz_triggers (SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME);
  173. create index IDX_QRTZ_T_NFT_ST
  174.    on qrtz_triggers (SCHED_NAME, TRIGGER_STATE, NEXT_FIRE_TIME);
  175. create index IDX_QRTZ_T_NFT_ST_MISFIRE
  176.    on qrtz_triggers (SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME, TRIGGER_STATE);
  177. create index IDX_QRTZ_T_NFT_ST_MISFIRE_GRP
  178.    on qrtz_triggers (SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME, TRIGGER_GROUP, TRIGGER_STATE);
  179. create index IDX_QRTZ_T_N_G_STATE
  180.    on qrtz_triggers (SCHED_NAME, TRIGGER_GROUP, TRIGGER_STATE);
  181. create index IDX_QRTZ_T_N_STATE
  182.    on qrtz_triggers (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP, TRIGGER_STATE);
  183. create index IDX_QRTZ_T_STATE
  184.    on qrtz_triggers (SCHED_NAME, TRIGGER_STATE);
复制代码
2.2.2.持久化配置

  1. quartz:
  2.   # 将任务等保存化到数据库
  3.   job-store-type: jdbc
  4.   # 程序结束时会等待quartz相关的内容结束
  5.   wait-for-jobs-to-complete-on-shutdown: true
  6.   overwrite-existing-jobs: true
  7.   properties:
  8.     org:
  9.       quartz:
  10.         scheduler:
  11.           # scheduler的实例名
  12.           instanceName: scheduler
  13.           #auto:自动生成唯一值
  14.           instanceId: AUTO
  15.         # 持久化相关
  16.         jobStore:
  17.           # 升级 springboot 版本,注释 class 属性
  18.           # class: org.quartz.impl.jdbcjobstore.JobStoreTX
  19.           # 数据库类型
  20.           driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
  21.           # 表示数据库表名前缀
  22.           tablePrefix: QRTZ_
  23.           useProperties: false
  24.         # 线程池相关
  25.         threadPool:
  26.           class: org.quartz.simpl.SimpleThreadPool
  27.           # 线程数
  28.           threadCount: 10
  29.           # 线程优先级
  30.           threadPriority: 5
  31.           threadsInheritContextClassLoaderOfInitializingThread: true
复制代码
2.2.3.重启实例,持久化成功




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

铁佛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表