首頁 > 軟體

SpringBoot2.6.3整合quartz的方式

2022-02-18 13:03:21

quartz使用

quartz啟動需要資料庫有很多表的支援,這些表的建表指令碼可以通過如下方式找到

如何找到quartz的資料庫指令碼
在這裡下載,需要注意的是下載2.2.3這個版本,不知道為什麼高版本的反而沒有,真是佛了

整合Springboot

程式碼
yml設定

spring:
  application:
    name: demo-excel
  datasource:
    url: jdbc:mysql://rm-xxx.mysql.rds.aliyuncs.com:3306/quartz_demo?zeroDateTimeBehavior=convertToNull
    password: quartz_demo
    username: quartz_demo
    driver-class-name: com.mysql.cj.jdbc.Driver
    name: datasource1
  quartz:
    # quartz任務儲存型別:jdbc或memory
    job-store-type: jdbc
    # 關閉時等待任務完成
    wait-for-jobs-to-complete-on-shutdown: true
    # 可以覆蓋已有的任務
    overwrite-existing-jobs: true
    properties:
      org:
        quartz:
          scheduler:
            # 排程器範例名稱
            instanceName: scheduler
            # 排程器範例ID自動生成
            instanceId: AUTO
          jobStore:
            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore
            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
            # quartz相關表字首
            tablePrefix: QRTZ_
            useProperties: false
          threadPool:
            class: org.quartz.simpl.SimpleThreadPool
            # 設定並行執行緒數量
            threadCount: 10
            # 指定執行緒優先順序
            threadPriority: 5
            threadsInheritContextClassLoaderOfInitializingThread: true
server:
  port: 8190
mybatis-plus:
  mapper-locations: classpath*:/mapperxml/*.xml

實現一個最簡單的任務,該任務輸出1111

@Component
public class TestJob extends QuartzJobBean {

    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext)
            throws JobExecutionException {
        // 任務的具體邏輯
        System.out.println(1111);
    }
}

設定這個任務的執行計劃

@Configuration
public class QuartzConfig {

    @Bean
    public JobDetail jobDetail() {
        JobDetail jobDetail = JobBuilder.newJob(TestJob.class)
                .withIdentity("test", "test")
                .storeDurably()
                .build();
        return jobDetail;
    }
    public Trigger trigger() {
        Trigger trigger = TriggerBuilder.newTrigger()
                .forJob(jobDetail())
                .startNow()
                .withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?"))
        return trigger;
}

啟動任務會看到控制檯每秒鐘列印一次1111

進階

上訴任務是設定在程式碼中,那麼如果我們想把任務設定資料庫中,這樣我們就可以做一個定時任務的維護頁面,可以對定時任務的觸發規則修改,及修改刪除定時任務應該怎麼做呢?

先定義一張儲存定時任務的表

-- auto-generated definition
create table sys_job
(
    id              bigint                  not null primary key,
    job_name        varchar(64)             not null comment '任務名稱',
    job_group       varchar(64)             not null comment '任務組名',
    method_name     varchar(500)            null comment '任務方法',
    method_params   varchar(50)             null comment '方法引數',
    cron_expression varchar(255)            null comment 'cron執行表示式',
    misfire_policy  varchar(20) default '3' null comment '計劃執行錯誤策略(1立即執行 2執行一次 3放棄執行)',
    concurrent      char        default '1' null comment '是否並行執行(0允許 1禁止)',
    status          char        default '0' null comment '狀態(0正常 1暫停)',
    create_by       varchar(64)             null comment '建立者',
    create_time     datetime                null comment '建立時間',
    update_by       varchar(64)             null comment '更新者',
    update_time     datetime                null comment '更新時間',
    remark          varchar(500)            null comment '備註資訊'
)
    comment '定時任務排程表';

插入一條資料

INSERT INTO quartz_demo.sys_job (id, job_name, job_group, method_name, method_params, cron_expression, misfire_policy, concurrent, status, create_by, create_time, update_by, update_time, remark) VALUES (1, 'testJob2', 'test2', 'exec', null, '* * * * * ?', '2', '1', '0', null, null, null, null, null);

同時定義一張執行結果記錄表

-- auto-generated definition
create table sys_job_log
(
    job_log_id     int auto_increment comment '任務紀錄檔ID'
        primary key,
    job_name       varchar(64)      not null comment '任務名稱',
    job_group      varchar(64)      not null comment '任務組名',
    method_name    varchar(500)     null comment '任務方法',
    method_params  varchar(50)      null comment '方法引數',
    job_message    varchar(500)     null comment '紀錄檔資訊',
    status         char default '0' null comment '執行狀態(0正常 1失敗)',
    exception_info varchar(2000)    null comment '異常資訊',
    create_time    datetime         null comment '建立時間'
)
    comment '定時任務排程紀錄檔表';

專案啟動時讀取這張表裡的資料放到quartz中執行
由於程式碼太多了,這邊就不列出來程式碼了,demo已經上傳到GitHub,專案基於springboot、mybatisplus。啟動載入任務的程式碼在com.bxoon.service.impl.SysJobServiceImpl

到此這篇關於SpringBoot2.6.3整合quartz的文章就介紹到這了,更多相關SpringBoot整合quartz內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com