最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot整合Quartz方法詳解

 更新時間:2023年04月26日 10:02:30   作者:Chengyunlai  
這篇文章詳解介紹了SpringBoot整合Quartz的方法,Quartz是一個比較成熟了的定時任務(wù)框架,本文實例代碼給大家詳細(xì)講解,需要的朋友可以參考下

為了方便你的學(xué)習(xí)

代碼地址:Chengyunlai/Quartz_learn: SpringBoot + Quartz定時任務(wù) (github.com)

基礎(chǔ)依賴

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

Quartz是單應(yīng)用工程中用的比較多的定時任務(wù)框架。該定時任務(wù)主要可以分為:

  • 在內(nèi)存中的任務(wù):一般定義在工程內(nèi)部存儲,如果工程重啟后,若該任務(wù)非自動執(zhí)行的,則不會再開啟。
  • 可持久化的任務(wù):將任務(wù)的特性存儲在數(shù)據(jù)庫中,工程重啟后可以重新讀取原先正在執(zhí)行的任務(wù),繼續(xù)執(zhí)行。

cron表達(dá)式

corn是用來控制任務(wù)觸發(fā)的時刻。

我列舉一些常用的:

  • 每秒鐘觸發(fā)
"* * * * * *":
  • 每隔5秒執(zhí)行一次
*/5 * * * * ? 
  • 每分鐘觸發(fā)
"0 * * * * ?"
  • 每一小時觸發(fā)
"0 * * * * ?"
  • 每天10點觸發(fā)一次
"0 0 10 * * ?"
  • 每天0點觸發(fā)一次
"0 0 0 * * ?"

通用

需要在啟動類上加上@EnableScheduling注解。

內(nèi)存任務(wù)

工程啟動時就在執(zhí)行的任務(wù)

直接定義一個執(zhí)行任務(wù),例如:

每秒都輸出測試

@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);
    }
}

啟動后看控制臺中就會輸出相應(yīng)的內(nèi)容。

手動控制某個任務(wù)

這里需要我們自己定義任務(wù)。

定義任務(wù)

通過實現(xiàn)Job接口,即可定義一個任務(wù),并且我們可以手動去控制這個任務(wù)的開啟。

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

借助Web-Controller去開啟該任務(wù)

導(dǎo)入依賴:

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

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

  • 指定任務(wù): JobBuilder.newJob(任務(wù).class) .withIdentity(任務(wù)名, 任務(wù)組).build();
  • 指定cron表達(dá)式,創(chuàng)建Trigger:
    • CronScheduleBuilder.cronSchedule(cron表達(dá)式);
    • TriggerBuilder.newTrigger().withIdentity(啟動器的名字, 啟動器的分組) .withSchedule(cron).build();
  • 調(diào)用任務(wù):scheduler.scheduleJob(任務(wù)類型對象, 啟動器對象)
/**
 * @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. 創(chuàng)建JobDetail,指定定時任務(wù)實現(xiàn)類的類型
        JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class)
                .withIdentity("test-schedule" + random, "test-group").build();
        // 2. 創(chuàng)建Trigger,并指定每3秒執(zhí)行一次
        CronScheduleBuilder cron = CronScheduleBuilder.cronSchedule("0/3 * * * * ?");

        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("test-trigger" + random, "test-trigger-group")
                .withSchedule(cron).build();

        // 3. 調(diào)度任務(wù)
        scheduler.scheduleJob(jobDetail, trigger);
        return "success";
    }

通過瀏覽器輸入項目的地址,一般默認(rèn)是localhost:8080/addSchedule,輸入后即可看到控制臺輸出了任務(wù)執(zhí)行的輸出內(nèi)容。

持久化

如果工程重啟了,上面的SimpleJob這個定時任務(wù)并不會重新啟動。解決的辦法就是將任務(wù)持久化,Quartz提供了解決方案,SpringBoot簡化了這個操作。我們只需要配置好:數(shù)據(jù)庫、數(shù)據(jù)源、操作數(shù)據(jù)庫的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數(shù)據(jù)庫:導(dǎo)入它的驅(qū)動,mysql-connector-java。
  • 使用Druid作為我們的數(shù)據(jù)源:druid。
  • 使用spring-jdbc,幫助我們自動將任務(wù)信息存入到數(shù)據(jù)庫中。

配置

# 設(shè)置將定時任務(wù)的信息保存到數(shù)據(jù)庫
spring.quartz.job-store-type=jdbc

# 每次應(yīng)用啟動的時候都初始化數(shù)據(jù)庫表結(jié)構(gòu)
# 如果 spring.quartz.jdbc.initialize-schema 設(shè)置為 always 的話有個問題:每次重啟應(yīng)用的時候,跟 Quartz 相關(guān)的表會被刪除重建!
# 所以為了避免表被重復(fù)創(chuàng)建,我們可以提前創(chuàng)建表,然后將其指定為never
spring.quartz.jdbc.initialize-schema=never

# 數(shù)據(jù)庫配置
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為我們準(zhǔn)備了sql數(shù)據(jù)表

官網(wǎng):Downloads (quartz-scheduler.org)

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

下載源碼后,找到jdbcjobstore這個目錄:

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

然后會有一系列的sql文件,找到和你數(shù)據(jù)庫匹配的那個sql文件即可,我用的是mysql。

 

執(zhí)行SQL文件建表,我的數(shù)據(jù)庫名是:scheduled,各位從我的url中應(yīng)該也能看出來。

建表完成后,所有配置工作結(jié)束了,啟動程序,重新在瀏覽器中輸入:localhost:8080/addSchedule,然后刷新一下數(shù)據(jù)庫,就會發(fā)現(xiàn)任務(wù)被持久化了,此時重啟工程后,該任務(wù)依舊會自動執(zhí)行。

暫停任務(wù)和刪除任務(wù)

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

  • 任務(wù)的名稱和組
JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class) .withIdentity(任務(wù)名,任務(wù)組).build();

在暫停和恢復(fù)任務(wù)時,就需要用JobKey.jobKey(任務(wù)名,任務(wù)組),得到一個JobKey,然后使用scheduler.pauseJob(jobkey)即可暫停任務(wù);scheduler.resumeJob(jobKey)恢復(fù)任務(wù)。

  • 刪除任務(wù)的時候需要將任務(wù)和Trigger都刪除,而在上面我們可以拿到這個jobkey表示任務(wù),我們也需要拿到trigger,同樣的我們也定義過啟動器的名字和分組。
`TriggerBuilder.newTrigger().withIdentity(啟動器的名字, 啟動器的分組) .withSchedule(cron).build();`

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

  • 通過以下順序完整刪除任務(wù)
    • // 停止觸發(fā)器
      • scheduler.pauseTrigger(triggerKey);
    • // 移除觸發(fā)器
      • scheduler.unscheduleJob(triggerKey);
    • // 刪除任務(wù)
      • scheduler.deleteJob(jobKey);
// 暫停
@GetMapping("/pauseSchedule")
public String pauseSchedule(String jobName, String jobGroup) throws SchedulerException {
    JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
    // 獲取定時任務(wù)
    JobDetail jobDetail = scheduler.getJobDetail(jobKey);
    if (jobDetail == null) {
        return "error";
    }
    scheduler.pauseJob(jobKey);
    return "success";
}

// 恢復(fù)
@GetMapping("/remuseSchedule")
public String remuseSchedule(String jobName, String jobGroup) throws SchedulerException {
    JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
    // 獲取定時任務(wù)
    JobDetail jobDetail = scheduler.getJobDetail(jobKey);
    if (jobDetail == null) {
        return "error";
    }
    scheduler.resumeJob(jobKey);
    return "success";
}

// 刪除定時任務(wù)
@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";
    }
    // 停止觸發(fā)器
    scheduler.pauseTrigger(triggerKey);
    // 移除觸發(fā)器
    scheduler.unscheduleJob(triggerKey);
    // 刪除任務(wù)
    scheduler.deleteJob(jobKey);
    return "success";
}

未來

后續(xù),我準(zhǔn)備結(jié)合前端,做一個頁面的定時任務(wù)功能。

到此這篇關(guān)于SpringBoot整合Quartz方法詳解的文章就介紹到這了,更多相關(guān)SpringBoot整合Quartz內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 圖解JAVA中Spring Aop作用

    圖解JAVA中Spring Aop作用

    這篇文章主要介紹了Java的Spring框架下的AOP的作用,需要的朋友可以參考
    2017-04-04
  • Hadoop的安裝與環(huán)境搭建教程圖解

    Hadoop的安裝與環(huán)境搭建教程圖解

    這篇文章主要介紹了Hadoop的安裝與環(huán)境搭建教程圖解,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-06-06
  • springboot+swagger2.10.5+mybatis-plus 入門詳解

    springboot+swagger2.10.5+mybatis-plus 入門詳解

    這篇文章主要介紹了springboot+swagger2.10.5+mybatis-plus 入門,本文通過實例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • MyBatis數(shù)組與集合判斷空問題

    MyBatis數(shù)組與集合判斷空問題

    這篇文章主要介紹了MyBatis數(shù)組與集合判斷空問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 淺談在Java中使用Callable、Future進行并行編程

    淺談在Java中使用Callable、Future進行并行編程

    這篇文章主要介紹了淺談在Java中使用Callable、Future進行并行編程,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • SpringBoot配置mybatis駝峰命名規(guī)則自動轉(zhuǎn)換的實現(xiàn)

    SpringBoot配置mybatis駝峰命名規(guī)則自動轉(zhuǎn)換的實現(xiàn)

    這篇文章主要介紹了SpringBoot配置mybatis駝峰命名規(guī)則自動轉(zhuǎn)換的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java并發(fā)編程深入理解之Synchronized的使用及底層原理詳解 上

    Java并發(fā)編程深入理解之Synchronized的使用及底層原理詳解 上

    在并發(fā)編程中存在線程安全問題,主要原因有:1.存在共享數(shù)據(jù) 2.多線程共同操作共享數(shù)據(jù)。關(guān)鍵字synchronized可以保證在同一時刻,只有一個線程可以執(zhí)行某個方法或某個代碼塊,同時synchronized可以保證一個線程的變化可見(可見性),即可以代替volatile
    2021-09-09
  • SpringBoot中注解@AliasFor的使用詳解

    SpringBoot中注解@AliasFor的使用詳解

    這篇文章主要為大家詳細(xì)介紹了SpringBoot中注解@AliasFor的用法,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下
    2022-05-05
  • 實現(xiàn)了基于TCP的Java Socket編程實例代碼

    實現(xiàn)了基于TCP的Java Socket編程實例代碼

    這篇文章主要介紹了基于TCP的Java Socket編程實例代碼,有需要的朋友可以參考一下
    2013-12-12
  • Netty分布式ByteBuf使用的底層實現(xiàn)方式源碼解析

    Netty分布式ByteBuf使用的底層實現(xiàn)方式源碼解析

    這篇文章主要為大家介紹了Netty分布式ByteBuf使用底層實現(xiàn)方式源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-03-03

最新評論

怀远县| 牙克石市| 同江市| 通化县| 双桥区| 信阳市| 桃源县| 阜康市| 南投县| 阜新市| 浦县| 东兴市| 大足县| 高陵县| 独山县| 南城县| 长乐市| 翼城县| 内丘县| 衡阳市| 台东市| 庆元县| 千阳县| 凤城市| 蓝山县| 望谟县| 塘沽区| 榆树市| 浙江省| 赤水市| 蒲城县| 辽中县| 颍上县| 沙洋县| 博白县| 江油市| 盐亭县| 普格县| 林周县| 康乐县| 宽城|