首頁  >  文章  >  Java  >  SpringBoot怎麼整合Quartz

SpringBoot怎麼整合Quartz

PHPz
PHPz轉載
2023-05-10 18:46:06902瀏覽

基礎依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
    <version>2.5.2</version>
</dependency>

Quartz是單一應用工程中用的比較多的定時任務框架。此定時任務主要可分為:

  • 在記憶體中的任務:一般定義在工程內部存儲,如果工程重啟後,若該任務非自動執行的,則不會再開啟。

  • 可持久化的任務:將任務的特性儲存在資料庫中,工程重新啟動後可以重新讀取原先正在執行的任務,繼續執行。

cron表達式

corn是用來控制任務觸發的時刻。

我列舉一些常用的:

  • 每秒鐘觸發

#
"* * * * * *":
  • 每隔5秒執行一次

*/5 * * * * ?
  • 每分鐘觸發

#
"0 * * * * ?"
  • ##每一小時觸發

  • "0 * * * * ?"
  • 每天10點觸發一次

  • #
    "0 0 10 * * ?"
  • 每天0點觸發一次

  • "0 0 0 * * ?"
通用

需要在啟動類別上加上

@EnableScheduling註解。

記憶體任務

工程啟動時就在執行的任務

直接定義一個執行任務,例如:

#每秒都輸出

測試

@Service
public class ScheduleTest {

    @Scheduled(cron = "0/1 * * * * *")
    public void test() {
        System.out.println("测试");
    }
}

啟動類別:

@SpringBootApplication
@EnableScheduling
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

啟動後看控制台中就會輸出對應的內容。

手動控制某個任務

這裡需要我們自己定義任務。

定義任務

透過實作

Job接口,即可定義一個任務,並且我們可以手動去控制這個任務的開啟。

public class SimpleJob implements Job {
    @Override
    public void execute(JobExecutionContext context) {
        System.out.println("自定义任务");
    }
}

借助Web-Controller去開啟該任務

導入依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.3.6.RELEASE</version>
</dependency>

寫Controller,這是一個固定的寫法。

  • 指定任務:

    JobBuilder.newJob(任務.class) .withIdentity(任務名稱, 任務群組).build();

  • #指定cron表達式,建立Trigger:

    • #CronScheduleBuilder.cronSchedule(cron表達式);

    • #TriggerBuilder.newTrigger().withIdentity(啟動器的名字, 啟動器的分組) .withSchedule(cron).build();

  • #呼叫任務:

    scheduler.scheduleJob(任務類型物件, 啟動器物件)

  • /**
     * @ClassName
     * @Description
     * @Author:chengyunlai
     * @Date
     * @Version 1.0
     **/
    @RestController
    public class DynamicScheduleController {
    
        @Autowired
        private Scheduler scheduler;
    
        @GetMapping("/addSchedule")
        public String addSchedule() throws SchedulerException {
            int random = ThreadLocalRandom.current().nextInt(1000);
            // 1. 创建JobDetail,指定定时任务实现类的类型
            JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class)
                    .withIdentity("test-schedule" + random, "test-group").build();
            // 2. 创建Trigger,并指定每3秒执行一次
            CronScheduleBuilder cron = CronScheduleBuilder.cronSchedule("0/3 * * * * ?");
    
            Trigger trigger = TriggerBuilder.newTrigger().withIdentity("test-trigger" + random, "test-trigger-group")
                    .withSchedule(cron).build();
    
            // 3. 调度任务
            scheduler.scheduleJob(jobDetail, trigger);
            return "success";
        }
透過瀏覽器輸入項目的位址,一般預設為

localhost:8080/addSchedule,輸入後即可看到控制台輸出了任務執行的輸出內容。

持久化

如果工程重啟了,上面的

SimpleJob這個定時任務並不會重新啟動。解決的辦法就是將任務持久化,Quartz提供了解決方案,SpringBoot簡化了這個操作。我們只需要配置好:資料庫、資料來源、操作資料庫的JDBC即可。

依賴:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.8</version>
</dependency>

  • 使用mysql資料庫:匯入它的驅動,mysql-connector-java。

  • 使用Druid作為我們的資料來源:druid。

  • 使用spring-jdbc,幫助我們自動將任務資訊存入資料庫。

設定

# 设置将定时任务的信息保存到数据库
spring.quartz.job-store-type=jdbc

# 每次应用启动的时候都初始化数据库表结构
# 如果 spring.quartz.jdbc.initialize-schema 设置为 always 的话有个问题:每次重启应用的时候,跟 Quartz 相关的表会被删除重建!
# 所以为了避免表被重复创建,我们可以提前创建表,然后将其指定为never
spring.quartz.jdbc.initialize-schema=never

# 数据库配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/scheduled?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=root

Quartz為我們準備了sql資料表

官網:Downloads (quartz-scheduler.org)

以我:quartz-2.3.0-SNAPSHOT為範例:

下載原始碼後,找到

jdbcjobstore這個目錄:

quartz-2.3.0-SNAPSHOT \src\org\quartz\impl\jdbcjobstore

然後會有一系列的

sql文件,找到和你資料庫匹配的那個sql文件即可,我用的是mysql 。

SpringBoot怎麼整合Quartz

執行SQL檔案建表,我的資料庫名稱是:

scheduled,各位從我的url應該也能看出來。

建表完成後,所有設定工作結束了,啟動程序,重新在瀏覽器中輸入:

localhost:8080/addSchedule,然後刷新一下資料庫,就會發現任務被持久化了,此時重啟工程後,該任務依舊會自動執行。

暫停任務和刪除任務

我們在手動開啟該任務的時候會指定:

  • 任務的名稱和群組

  • #
    JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class) .withIdentity(任务名,任务组).build();
在暫停和復原任務時,就需要用

JobKey.jobKey(任務名,任務群組),得到一個JobKey,然後使用 scheduler.pauseJob(jobkey)即可暫停任務;scheduler.resumeJob(jobKey)恢復任務。

  • 刪除任務的時候需要將任務和Trigger都刪除,而在上面我們可以拿到這個

    jobkey表示任務,我們也需要拿到trigger,同樣的我們也定義過啟動器的名字和分組。

  • `TriggerBuilder.newTrigger().withIdentity(启动器的名字, 启动器的分组) .withSchedule(cron).build();`

TriggerKey.triggerKey((啟動器的名字, 啟動器的分組);也可以拿到trigger表示啟動器。

  • 通过以下顺序完整删除任务

    • scheduler.deleteJob(jobKey);

    • scheduler.unscheduleJob(triggerKey);

    • scheduler.pauseTrigger(triggerKey);

    • // 停止触发器

    • // 移除触发器

    • // 删除任务

// 暂停
@GetMapping("/pauseSchedule")
public String pauseSchedule(String jobName, String jobGroup) throws SchedulerException {
    JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
    // 获取定时任务
    JobDetail jobDetail = scheduler.getJobDetail(jobKey);
    if (jobDetail == null) {
        return "error";
    }
    scheduler.pauseJob(jobKey);
    return "success";
}

// 恢复
@GetMapping("/remuseSchedule")
public String remuseSchedule(String jobName, String jobGroup) throws SchedulerException {
    JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
    // 获取定时任务
    JobDetail jobDetail = scheduler.getJobDetail(jobKey);
    if (jobDetail == null) {
        return "error";
    }
    scheduler.resumeJob(jobKey);
    return "success";
}

// 删除定时任务
@GetMapping("/removeSchedule")
public String removeSchedule(String jobName, String jobGroup, String triggerName, String triggerGroup) throws SchedulerException {
    TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroup);
    JobKey jobKey = JobKey.jobKey(jobName, jobGroup);

    Trigger trigger = scheduler.getTrigger(triggerKey);
    if (trigger == null) {
        return "error";
    }
    // 停止触发器
    scheduler.pauseTrigger(triggerKey);
    // 移除触发器
    scheduler.unscheduleJob(triggerKey);
    // 删除任务
    scheduler.deleteJob(jobKey);
    return "success";
}

以上是SpringBoot怎麼整合Quartz的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除