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

SpringBoot整合Quartz實現(xiàn)定時任務(wù)詳解

 更新時間:2022年08月08日 10:48:20   作者:Cavewang  
這篇文章主要介紹了Java?任務(wù)調(diào)度框架?Quartz,Quartz是OpenSymphony開源組織在Job?scheduling領(lǐng)域又一個開源項目,完全由Java開發(fā),可以用來執(zhí)行定時任務(wù),類似于java.util.Timer。,下面我們來學(xué)習(xí)一下關(guān)于?Quartz更多的詳細(xì)內(nèi)容,需要的朋友可以參考一下

Quartz簡介

Quartz 是一個開源的作業(yè)調(diào)度框架,它完全由 Java 寫成,并設(shè)計用于 J2SE 和 J2EE 應(yīng)用中。它提供了巨大的靈活性而不犧牲簡單性。你能夠用它來為執(zhí)行一個作業(yè)而創(chuàng)建簡單的或復(fù)雜的調(diào)度。它有很多特征,如:數(shù)據(jù)庫支持,集群,插件,EJB 作業(yè)預(yù)構(gòu)建,JavaMail 及其它,支持 cron-like 表達(dá)式等等。

核心概念

主要有三個核心概念:調(diào)度器、任務(wù)和觸發(fā)器。三者關(guān)系簡單來說就是,調(diào)度器負(fù)責(zé)調(diào)度各個任務(wù),到了某個時刻或者過了一定時間,觸發(fā)器觸動了,特定任務(wù)便啟動執(zhí)行。

Scheduler

Scheduler(調(diào)度器),基于trigger(觸發(fā)器)的設(shè)定執(zhí)行job(任務(wù)),代表一個Quartz的獨立運行容器,Trigger和JobDetail要注冊到Scheduler中才會生效,也就是讓調(diào)度器知道有哪些觸發(fā)器和任務(wù),才能進行按規(guī)則進行調(diào)度任務(wù)。

JobDetail

Quartz 中需要執(zhí)行的任務(wù)詳情,包括了任務(wù)的唯一標(biāo)識和具體要執(zhí)行的任務(wù),可以通過 JobDataMap 往任務(wù)中傳遞數(shù)據(jù)

Job

Job(任務(wù)),封裝成JobDetail設(shè)置屬性。

其中有兩個重要注解

@DisallowConcurrentExecution :禁止并發(fā)的執(zhí)行同一個job定義的多個實例

@PersistJobDataAfterExecution:持久化JobDetail中的JobDataMap(對trigger中的DataMap無效)

Trigger

Trigger(觸發(fā)器),描述觸發(fā)Job執(zhí)行的時間觸發(fā)規(guī)則。有SimpleTrigger和CronTrigger兩個子類代表兩種方式,一種是每隔多少分鐘小時執(zhí)行,則用SimpleTrigger;另一種是日歷相關(guān)的重復(fù)時間間隔,如每天凌晨,每周星期一運行的話,通過Cron表達(dá)式便可定義出復(fù)雜的調(diào)度方案。

SpringBoot整合Quartz

準(zhǔn)備數(shù)據(jù)庫表

不同版本的quartz使用的數(shù)據(jù)庫表不同,具體如下,選擇對應(yīng)版本即可

https://github.com/quartz-scheduler/quartz/tree/quartz-2.1.x

創(chuàng)建之后,表關(guān)系如圖所示

Maven相關(guān)依賴

        <!--spring連接驅(qū)動時,如com.mysql.cj.jdbc.Driver使用-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!--quartz依賴-->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz-jobs</artifactId>
            <version>2.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>

配置文件

application.yml

spring:
    datasource:
      username: xxx
      password: xxxxxx
      url: jdbc:mysql://localhost:3306/qrtz_db?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
      driver-class-name: com.mysql.cj.jdbc.Driver

spring-quartz.properties

#===================================================================
#配置JobStore
#===================================================================

#JobDataMaps是否都為String類型,默認(rèn)為false
org.quartz.jobStore.useProperties = false

#表前綴
org.quartz.jobStore.tablePrefix = qrtz_

#是否加入集群
org.quartz.jobStore.isClustered = true

#調(diào)度實例失敗的檢查時間間隔 ms
org.quartz.jobStore.clusterCheckinInterval = 5000

org.quartz.jobStore.txIsolationLevelReadCommitted = true

#數(shù)據(jù)保存方式為數(shù)據(jù)持久化
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX

#數(shù)據(jù)庫代理類,一般org.quartz.impl.jdbcjobstore.StdJDBCDelegate可以滿足大部分?jǐn)?shù)據(jù)庫
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate

#===================================================================
#配置Scheduler 調(diào)度器屬性配置
#===================================================================

#調(diào)度標(biāo)識名 集群中每一個實例都必須使用相同的名稱
org.quartz.scheduler.instanceName = ClusterQuartz

#ID設(shè)置為自動獲取 每一個必須不同
org.quartz.scheduler.instanceId = AUTO

#===================================================================
#配置ThreadPool
#===================================================================

#線程池的實現(xiàn)類(一般使用SimpleThreadPool即可滿足幾乎所有的用戶)
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool

#指定線程數(shù),一般設(shè)定為1-100之間的整數(shù),根據(jù)系統(tǒng)資源配置
org.quartz.threadPool.threadCount = 5

#設(shè)置線程的優(yōu)先級(可以是Thread.MIN_PRIORITY(即1)和Thread.MAX_PRIORITY(10)之間的任何int)
org.quartz.threadPool.threadPriority = 5

quartz配置類

@Configuration
public class SchedulerConfig {
    @Autowired
    private DataSource dataSource;
    @Bean
    public Scheduler scheduler() throws IOException {
        return schedulerFactoryBean().getScheduler();
    }
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean() throws IOException {
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        factory.setSchedulerName("cluster_scheduler");
        factory.setDataSource(dataSource);
        factory.setApplicationContextSchedulerContextKey("application");
        factory.setQuartzProperties(quartzProperties());
        factory.setTaskExecutor(schedulerThreadPool());
        factory.setStartupDelay(10);
        return factory;
    }
    @Bean
    public Properties quartzProperties() throws IOException {
        PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
        propertiesFactoryBean.setLocation(new ClassPathResource("/spring-quartz.properties"));
        propertiesFactoryBean.afterPropertiesSet();
        return propertiesFactoryBean.getObject();
    }
    @Bean
    public Executor schedulerThreadPool(){
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(8);
        executor.setMaxPoolSize(8);
        executor.setQueueCapacity(8);
        return executor;
    }
}

創(chuàng)建任務(wù)類

@PersistJobDataAfterExecution
@DisallowConcurrentExecution
public class QuartzJob extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        try {
            Thread.sleep(2000);
            System.out.println(context.getScheduler().getSchedulerInstanceId());
            System.out.println("taskName="+context.getJobDetail().getKey().getName());
            System.out.println("執(zhí)行時間="+new Date());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

創(chuàng)建監(jiān)聽類

@Component
public class StartApplicationListener implements ApplicationListener<ContextRefreshedEvent> {
    @Autowired
    private Scheduler scheduler;
    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        TriggerKey triggerKey = TriggerKey.triggerKey("trigger1","group1");
        try {
            Trigger trigger = scheduler.getTrigger(triggerKey);
            if (trigger == null){
                trigger = TriggerBuilder.newTrigger()
                        .withIdentity(triggerKey)
                        .withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * * * ?"))
                        .startNow()
                        .build();
                JobDetail jobDetail = JobBuilder.newJob(QuartzJob.class)
                        .withIdentity("job1","group1")
                        .build();
                scheduler.scheduleJob(jobDetail,trigger);
                scheduler.start();
            }
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
}

運行結(jié)果

可以看到每隔十秒執(zhí)行一次。

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

相關(guān)文章

  • 為什么SpringMVC中請求的body不支持多次讀取

    為什么SpringMVC中請求的body不支持多次讀取

    這篇文章主要介紹了為什么SpringMVC中請求的body不支持多次讀取,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Java實現(xiàn)的矩陣乘法示例

    Java實現(xiàn)的矩陣乘法示例

    這篇文章主要介紹了Java實現(xiàn)的矩陣乘法,簡單描述了矩陣乘法的原理,并結(jié)合實例形式分析了java實現(xiàn)矩陣乘法的相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03
  • Mybatis之類型處理器TypeHandler的作用與自定義方式

    Mybatis之類型處理器TypeHandler的作用與自定義方式

    這篇文章主要介紹了Mybatis之類型處理器TypeHandler的作用與自定義方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Java中Spring的Security使用詳解

    Java中Spring的Security使用詳解

    這篇文章主要介紹了Java中Spring的Security使用詳解,在web應(yīng)用開發(fā)中,安全無疑是十分重要的,選擇Spring Security來保護web應(yīng)用是一個非常好的選擇,需要的朋友可以參考下
    2023-07-07
  • Lucene實現(xiàn)索引和查詢的實例講解

    Lucene實現(xiàn)索引和查詢的實例講解

    下面小編就為大家分享一篇Lucene實現(xiàn)索引和查詢的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Java并發(fā)編程之詳解CyclicBarrier線程同步

    Java并發(fā)編程之詳解CyclicBarrier線程同步

    在之前的文章中已經(jīng)為大家介紹了java并發(fā)編程的工具:BlockingQueue接口,ArrayBlockingQueue,DelayQueue,LinkedBlockingQueue,PriorityBlockingQueue,SynchronousQueue,BlockingDeque接口,ConcurrentHashMap,CountDownLatch,本文為系列文章第十篇,需要的朋友可以參考下
    2021-06-06
  • SpringBoot + Spring Security 基本使用及個性化登錄配置詳解

    SpringBoot + Spring Security 基本使用及個性化登錄配置詳解

    這篇文章主要介紹了SpringBoot + Spring Security 基本使用及個性化登錄配置詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Java的特點和優(yōu)點(動力節(jié)點整理)

    Java的特點和優(yōu)點(動力節(jié)點整理)

    由于Java語言的設(shè)計者們十分熟悉C++語言,所以在設(shè)計時很好地借鑒了C++語言。可以說,Java語言是一種比C++語言“還面向?qū)ο蟆钡囊环N編程語言,下面通過本文說下java的特點和優(yōu)點
    2017-03-03
  • java 多線程的同步幾種方法

    java 多線程的同步幾種方法

    這篇文章主要介紹了java 多線程的同步幾種方法的相關(guān)資料,這里提供5種方法,需要的朋友可以參考下
    2017-09-09
  • 解析Linux系統(tǒng)中JVM內(nèi)存2GB上限的詳解

    解析Linux系統(tǒng)中JVM內(nèi)存2GB上限的詳解

    本篇文章是對Linux系統(tǒng)中JVM內(nèi)存2GB上限進行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05

最新評論

弋阳县| 永胜县| 晋江市| 长武县| 桂平市| 达孜县| 淮滨县| 兴安盟| 罗江县| 泽州县| 邵阳市| 克拉玛依市| 嘉善县| 齐河县| 土默特左旗| 鹤岗市| 信宜市| 资源县| 高邮市| 衡阳市| 泾源县| 阆中市| 丹江口市| 东宁县| 夏邑县| 东乌珠穆沁旗| 吴桥县| 辽阳县| 仙桃市| 桐城市| 宁津县| 洪洞县| 涡阳县| 东平县| 柘城县| 沧源| 偃师市| 六枝特区| 东山县| 上思县| 呼和浩特市|