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

Springboot集成Quartz實(shí)現(xiàn)定時(shí)任務(wù)代碼實(shí)例

 更新時(shí)間:2023年09月20日 10:39:57   作者:CD4356  
這篇文章主要介紹了Springboot集成Quartz實(shí)現(xiàn)定時(shí)任務(wù)代碼實(shí)例,任務(wù)是有可能并發(fā)執(zhí)行的,若Scheduler直接使用Job,就會(huì)存在對(duì)同一個(gè)Job實(shí)例并發(fā)訪問的問題,而JobDetail?&?Job方式,Scheduler都會(huì)根據(jù)JobDetail創(chuàng)建一個(gè)新的Job實(shí)例,這樣就可以規(guī)避并發(fā)訪問問題

Springboot集成Quartz實(shí)現(xiàn)定時(shí)任務(wù)代碼實(shí)例

Quartz是一款功能強(qiáng)大的任務(wù)調(diào)度器,Quartz有兩個(gè)比較核心的組件:Job 和 Trigger。

Quartz的三個(gè)基本要素

  • Scheduler:調(diào)度器,所有的調(diào)度都是由它來控制。
  • Trigger:觸發(fā)器,決定什么時(shí)候執(zhí)行任務(wù)
  • JobDetail & Job:JobDetail定義的是任務(wù)數(shù)據(jù),而真正執(zhí)行邏輯是在Job中。任務(wù)是有可能并發(fā)執(zhí)行的,若Scheduler直接使用Job,就會(huì)存在對(duì)同一個(gè)Job實(shí)例并發(fā)訪問的問題。而JobDetail & Job方式,Scheduler都會(huì)根據(jù)JobDetail創(chuàng)建一個(gè)新的Job實(shí)例,這樣就可以規(guī)避并發(fā)訪問問題

Spring Boot自帶定時(shí)任務(wù),默認(rèn)是單線程

1. 使用spring boot自帶定時(shí)任務(wù)無需添加相關(guān)依賴包

2. 在啟動(dòng)類上添加 @EnableScheduling 注解

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
public class O2o2Application {
    public static void main(String[] args) {
        SpringApplication.run(O2o2Application.class, args);
        System.out.println("項(xiàng)目啟動(dòng)成功!");
    }
}

3. 在方法上標(biāo)注 @Scheduled 注解,指定該方法作為定時(shí)任務(wù)運(yùn)行的方法。并通過cron屬性設(shè)置cron表達(dá)式,來指定定時(shí)任務(wù)的執(zhí)行時(shí)間

import com.cd.o2o2.dao.ProductSellDailyDao;
import com.cd.o2o2.service.ProductSellDailyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.Date;
@Service("productSellDailyService")
public class ProductSellDailyServiceImpl implements ProductSellDailyService {
	@Override
    @Scheduled(cron = "0/2 * * * * ?") //定時(shí)任務(wù)運(yùn)行的方法
    public void demo1() {
        SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(dataFormat.format(new Date()) + "  Quartz Running!");
    }
	@Override
    @Scheduled(cron = "0/5 * * * * ?") //定時(shí)任務(wù)運(yùn)行的方法
    public void demo2() {
        SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("\n當(dāng)前執(zhí)行時(shí)間: " + dataFormat.format(new Date()) + "\n");
    }
}

啟動(dòng)SpringBoot,查看控制臺(tái)打印信息! demo1()每2秒定時(shí)運(yùn)行一次,demo2()每5秒定時(shí)運(yùn)行一次 cd4356

如果不想使用Spring Boot自帶的定時(shí)任務(wù),則需要添加quartz相關(guān)依賴包

pom.xml

<!--定時(shí)組件-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

Quartz配置類(Job的定義有兩種方式,分別為JobDetailFactoryBean和MethodInvokingJobDetailFactoryBean,下面使用MethodInvokingJobDetailFactoryBean類來定義job)

package com.cd.o2o2.config.quartz;
import com.cd.o2o2.service.ProductSellDailyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
@Configuration //標(biāo)注@Configuration的類,相當(dāng)于一個(gè)xml配置文件
public class QuartzConfiguration {
    @Autowired
    private ProductSellDailyService productSellDailyService;
    @Autowired
    private MethodInvokingJobDetailFactoryBean jobDetailFactory;
    @Autowired
    private CronTriggerFactoryBean cronTriggerFactory;
    /**
     * 配置jobDetail作業(yè)類
     * @return
     */
    @Bean(name = "jobDetailFactory") //標(biāo)注@Bean后表明返回對(duì)象會(huì)被當(dāng)做一個(gè)Bean注冊(cè)到Spring IoC容器
    public MethodInvokingJobDetailFactoryBean createJobDetail(){
        MethodInvokingJobDetailFactoryBean jobDetailFactoryBean = new MethodInvokingJobDetailFactoryBean();
        //指定任務(wù)名稱
        jobDetailFactoryBean.setName("product_sell_daily_job");
        //指定組名稱
        jobDetailFactoryBean.setGroup("job_product_sell_daily_group");
        /*
          對(duì)于同一個(gè)JobDetail,當(dāng)指定多個(gè)trigger時(shí),很可能第一個(gè)job完成之前,第二個(gè)job就開始了
          指定concurrent屬性為false,多個(gè)job就會(huì)串行執(zhí)行,而不會(huì)并發(fā)執(zhí)行,即第一個(gè)job完成前,第二個(gè)job不會(huì)開啟
         */
        jobDetailFactoryBean.setConcurrent(false);
        //指定具體的job任務(wù)類
        jobDetailFactoryBean.setTargetObject(productSellDailyService);
        //指定運(yùn)行任務(wù)的方法
        jobDetailFactoryBean.setTargetMethod("dailyCalculate");
        return jobDetailFactoryBean;
    }
    /**
     * 配置cronTrigger觸發(fā)器(作業(yè)調(diào)度的方式)
     * @return
     */
    @Bean(name = "cronTriggerFactory")
    public CronTriggerFactoryBean createProductSellDailyTrigger(){
        CronTriggerFactoryBean triggerFactory = new CronTriggerFactoryBean();
        //指定trigger的名稱
        triggerFactory.setName("product_sell_daily_trigger");
        //指定trigger的組名
        triggerFactory.setGroup("job_product_sell_daily_group");
        //指定trigger綁定的job
        triggerFactory.setJobDetail(jobDetailFactory.getObject());
        //設(shè)置cron表達(dá)式,每天凌晨定時(shí)運(yùn)行(通過在線Cron表達(dá)式生成器來生成)
        triggerFactory.setCronExpression("0/2 * * * * ?");
        return triggerFactory;
    }
    /**
     * 配置scheduler調(diào)度工廠
     * @return
     */
    @Bean
    public SchedulerFactoryBean createScheduler(){
        SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
        //綁定cronTrigger
        schedulerFactory.setTriggers(cronTriggerFactory.getObject());
        return schedulerFactory;
    }
}

dailyCalculate()方法,是定時(shí)任務(wù)運(yùn)行的方法

package com.cd.o2o2.service.impl;
import com.cd.o2o2.service.ProductSellDailyService;
import org.springframework.stereotype.Service;
import java.util.Date;
@Service("productSellDailyService")
public class ProductSellDailyServiceImpl implements ProductSellDailyService {
    /**
     * 定時(shí)任務(wù)運(yùn)行的方法
     */
    @Override
    public void dailyCalculate() {
        System.out.println(new Date()+": Quartz Running!");
    }
}

啟動(dòng)SpringBoot,查看控制臺(tái)打印信息!dailyCalculate()方法每2秒定時(shí)運(yùn)行一次

cd4356

Cron表達(dá)式示例

cd4356

到此這篇關(guān)于Springboot集成Quartz實(shí)現(xiàn)定時(shí)任務(wù)代碼實(shí)例的文章就介紹到這了,更多相關(guān)Springboot定時(shí)任務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中關(guān)于char類型變量能夠輸出中文的問題

    Java中關(guān)于char類型變量能夠輸出中文的問題

    這篇文章主要介紹了Java中關(guān)于char類型變量能夠輸出中文的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java學(xué)習(xí)關(guān)于循環(huán)和數(shù)組練習(xí)題整理

    Java學(xué)習(xí)關(guān)于循環(huán)和數(shù)組練習(xí)題整理

    在本篇文章里小編給各位整理了關(guān)于Java學(xué)習(xí)關(guān)于循環(huán)和數(shù)組練習(xí)題相關(guān)內(nèi)容,有興趣的朋友們跟著參考學(xué)習(xí)下。
    2019-07-07
  • Java抽象類和接口使用梳理

    Java抽象類和接口使用梳理

    對(duì)于面向?qū)ο缶幊虂碚f,抽象是它的一大特征之一,在?Java?中可以通過兩種形式來體現(xiàn)OOP的抽象:接口和抽象類,下面這篇文章主要給大家介紹了關(guān)于Java入門基礎(chǔ)之抽象類與接口的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • Java原子類中的AtomicInteger類詳解

    Java原子類中的AtomicInteger類詳解

    這篇文章主要介紹了Java原子類中的AtomicInteger類詳解,原子類可以保證對(duì)"變量"操作的,原子性、有序性、可見性,我們可以通過AtomicInteger類,來看看它們是怎樣工作的,需要的朋友可以參考下
    2023-10-10
  • 如何在Spring中使用編碼方式動(dòng)態(tài)配置Bean詳解

    如何在Spring中使用編碼方式動(dòng)態(tài)配置Bean詳解

    這篇文章主要給大家介紹了關(guān)于如何在Spring中使用編碼方式動(dòng)態(tài)配置Bean的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • Java接口RandomAccess全面了解

    Java接口RandomAccess全面了解

    下面小編就為大家?guī)硪黄狫ava接口RandomAccess全面了解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-09-09
  • 什么情況下會(huì)出現(xiàn)java.io.IOException?:?Broken?pipe這個(gè)錯(cuò)誤以及解決辦法

    什么情況下會(huì)出現(xiàn)java.io.IOException?:?Broken?pipe這個(gè)錯(cuò)誤以及解決辦法

    這篇文章主要介紹了什么情況下會(huì)出現(xiàn)java.io.IOException?:?Broken?pipe這個(gè)錯(cuò)誤以及解決辦法的相關(guān)資料,這個(gè)錯(cuò)誤表示通信另一端已關(guān)閉連接,常發(fā)生在客戶端關(guān)閉連接、網(wǎng)絡(luò)超時(shí)或資源不足等情況,文中將解決辦法介紹的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • Java的反射機(jī)制之獲取class詳解

    Java的反射機(jī)制之獲取class詳解

    這篇文章主要介紹了Java的反射機(jī)制之獲取class詳解,Class類表示一個(gè)類或接口的元數(shù)據(jù),通過它可以獲取到類或接口的構(gòu)造函數(shù)、方法、字段、注解等信息,也能夠創(chuàng)建對(duì)象、調(diào)用方法等,需要的朋友可以參考下
    2023-09-09
  • Reactive反應(yīng)式編程及使用介紹

    Reactive反應(yīng)式編程及使用介紹

    這篇文章主要介紹了為什使用Reactive反應(yīng)式編程的原因分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步,早日升職加薪
    2022-02-02
  • SpringBoot應(yīng)用部署之WAR包部署方式

    SpringBoot應(yīng)用部署之WAR包部署方式

    這篇文章主要介紹了SpringBoot應(yīng)用部署之WAR包部署方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03

最新評(píng)論

交口县| 武城县| 进贤县| 洪泽县| 理塘县| 牟定县| 阿拉善盟| 屏东县| 湘潭县| 沈阳市| 巴林右旗| 吉安县| 临澧县| 孟村| 华蓥市| 西丰县| 孝昌县| 文山县| 静海县| 连南| 东台市| 白银市| 临安市| 外汇| 兴海县| 棋牌| 会宁县| 崇仁县| 政和县| 郧西县| 晋中市| 皮山县| 华阴市| 若尔盖县| 珠海市| 滕州市| 大厂| 利川市| 茶陵县| 吉隆县| 夏津县|