国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

微服務(wù)系列文章 之SpringBoot之定時(shí)任務(wù)詳解

這篇具有很好參考價(jià)值的文章主要介紹了微服務(wù)系列文章 之SpringBoot之定時(shí)任務(wù)詳解。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

序言

使用SpringBoot創(chuàng)建定時(shí)任務(wù)非常簡(jiǎn)單,目前主要有以下三種創(chuàng)建方式:

  • 一、基于注解(@Scheduled)
  • 二、基于接口(SchedulingConfigurer) 前者相信大家都很熟悉,但是實(shí)際使用中我們往往想從數(shù)據(jù)庫中讀取指定時(shí)間來動(dòng)態(tài)執(zhí)行定時(shí)任務(wù),這時(shí)候基于接口的定時(shí)任務(wù)就派上用場(chǎng)了。
  • 三、基于注解設(shè)定多線程定時(shí)任務(wù)

一、靜態(tài):基于注解

基于注解@Scheduled默認(rèn)為單線程,開啟多個(gè)任務(wù)時(shí),任務(wù)的執(zhí)行時(shí)機(jī)會(huì)受上一個(gè)任務(wù)執(zhí)行時(shí)間的影響。

1、創(chuàng)建定時(shí)器

使用SpringBoot基于注解來創(chuàng)建定時(shí)任務(wù)非常簡(jiǎn)單,只需幾行代碼便可完成。?代碼如下:

@Configuration      //1.主要用于標(biāo)記配置類,兼?zhèn)銫omponent的效果。
@EnableScheduling   // 2.開啟定時(shí)任務(wù)
public class SaticScheduleTask {
    //3.添加定時(shí)任務(wù)
    @Scheduled(cron = "0/5 * * * * ?")
    //或直接指定時(shí)間間隔,例如:5秒
    //@Scheduled(fixedRate=5000)
    private void configureTasks() {
        System.err.println("執(zhí)行靜態(tài)定時(shí)任務(wù)時(shí)間: " + LocalDateTime.now());
    }
}

Cron表達(dá)式參數(shù)分別表示:

  • 秒(0~59) 例如0/5表示每5秒
  • 分(0~59)
  • 時(shí)(0~23)
  • 日(0~31)的某天,需計(jì)算
  • 月(0~11)
  • 周幾( 可填1-7 或 SUN/MON/TUE/WED/THU/FRI/SAT)

@Scheduled:除了支持靈活的參數(shù)表達(dá)式cron之外,還支持簡(jiǎn)單的延時(shí)操作,例如 fixedDelay ,fixedRate 填寫相應(yīng)的毫秒數(shù)即可。

// Cron表達(dá)式范例:

每隔5秒執(zhí)行一次:*/5 * * * * ?

每隔1分鐘執(zhí)行一次:0 */1 * * * ?

每天23點(diǎn)執(zhí)行一次:0 0 23 * * ?

每天凌晨1點(diǎn)執(zhí)行一次:0 0 1 * * ?

每月1號(hào)凌晨1點(diǎn)執(zhí)行一次:0 0 1 1 * ?

每月最后一天23點(diǎn)執(zhí)行一次:0 0 23 L * ?

每周星期天凌晨1點(diǎn)實(shí)行一次:0 0 1 ? * L

在26分、29分、33分執(zhí)行一次:0 26,29,33 * * * ?

每天的0點(diǎn)、13點(diǎn)、18點(diǎn)、21點(diǎn)都執(zhí)行一次:0 0 0,13,18,21 * * ?
2、啟動(dòng)測(cè)試

啟動(dòng)應(yīng)用,可以看到控制臺(tái)打印出如下信息:

微服務(wù)系列文章 之SpringBoot之定時(shí)任務(wù)詳解,spring boot,微服務(wù),java

?文章來源地址http://www.zghlxwxcb.cn/news/detail-573674.html

顯然,使用@Scheduled 注解很方便,但缺點(diǎn)是當(dāng)我們調(diào)整了執(zhí)行周期的時(shí)候,需要重啟應(yīng)用才能生效,這多少有些不方便。為了達(dá)到實(shí)時(shí)生效的效果,可以使用接口來完成定時(shí)任務(wù)。

二、動(dòng)態(tài):基于接口

基于接口(SchedulingConfigurer)

1、導(dǎo)入依賴包:
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>2.0.4.RELEASE</version>
    </parent>

    <dependencies>
        <dependency><!--添加Web依賴 -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency><!--添加MySql依賴 -->
             <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency><!--添加Mybatis依賴 配置mybatis的一些初始化的東西-->
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency><!-- 添加mybatis依賴 -->
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
2、添加數(shù)據(jù)庫記錄:

開啟本地?cái)?shù)據(jù)庫mysql,隨便打開查詢窗口,然后執(zhí)行腳本內(nèi)容,如下:

DROP DATABASE IF EXISTS `socks`;
CREATE DATABASE `socks`;
USE `SOCKS`;
DROP TABLE IF EXISTS `cron`;
CREATE TABLE `cron`  (
  `cron_id` varchar(30) NOT NULL PRIMARY KEY,
  `cron` varchar(30) NOT NULL  
);
INSERT INTO `cron` VALUES ('1', '0/5 * * * * ?');

微服務(wù)系列文章 之SpringBoot之定時(shí)任務(wù)詳解,spring boot,微服務(wù),java

?然后在項(xiàng)目中的application.yml 添加數(shù)據(jù)源:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/socks
    username: root
    password: 123456
3、創(chuàng)建定時(shí)器

數(shù)據(jù)庫準(zhǔn)備好數(shù)據(jù)之后,我們編寫定時(shí)任務(wù),注意這里添加的是TriggerTask,目的是循環(huán)讀取我們?cè)跀?shù)據(jù)庫設(shè)置好的執(zhí)行周期,以及執(zhí)行相關(guān)定時(shí)任務(wù)的內(nèi)容。
具體代碼如下:

@Configuration      //1.主要用于標(biāo)記配置類,兼?zhèn)銫omponent的效果。
@EnableScheduling   // 2.開啟定時(shí)任務(wù)
public class DynamicScheduleTask implements SchedulingConfigurer {

    @Mapper
    public interface CronMapper {
        @Select("select cron from cron limit 1")
        public String getCron();
    }

    @Autowired      //注入mapper
    @SuppressWarnings("all")
    CronMapper cronMapper;

    /**
     * 執(zhí)行定時(shí)任務(wù).
     */
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {

        taskRegistrar.addTriggerTask(
                //1.添加任務(wù)內(nèi)容(Runnable)
                () -> System.out.println("執(zhí)行動(dòng)態(tài)定時(shí)任務(wù): " + LocalDateTime.now().toLocalTime()),
                //2.設(shè)置執(zhí)行周期(Trigger)
                triggerContext -> {
                    //2.1 從數(shù)據(jù)庫獲取執(zhí)行周期
                    String cron = cronMapper.getCron();
                    //2.2 合法性校驗(yàn).
                    if (StringUtils.isEmpty(cron)) {
                        // Omitted Code ..
                    }
                    //2.3 返回執(zhí)行周期(Date)
                    return new CronTrigger(cron).nextExecutionTime(triggerContext);
                }
        );
    }

}
4、啟動(dòng)測(cè)試

啟動(dòng)應(yīng)用后,查看控制臺(tái),打印時(shí)間是我們預(yù)期的每10秒一次:

微服務(wù)系列文章 之SpringBoot之定時(shí)任務(wù)詳解,spring boot,微服務(wù),java

然后打開Navicat ,將執(zhí)行周期修改為每6秒執(zhí)行一次,如圖:
微服務(wù)系列文章 之SpringBoot之定時(shí)任務(wù)詳解,spring boot,微服務(wù),java

?查看控制臺(tái),發(fā)現(xiàn)執(zhí)行周期已經(jīng)改變,并且不需要我們重啟應(yīng)用,十分方便。如圖:

微服務(wù)系列文章 之SpringBoot之定時(shí)任務(wù)詳解,spring boot,微服務(wù),java

注意:?如果在數(shù)據(jù)庫修改時(shí)格式出現(xiàn)錯(cuò)誤,則定時(shí)任務(wù)會(huì)停止,即使重新修改正確;此時(shí)只能重新啟動(dòng)項(xiàng)目才能恢復(fù)。

三、多線程定時(shí)任務(wù)

基于注解設(shè)定多線程定時(shí)任務(wù)

1、創(chuàng)建多線程定時(shí)任務(wù)
//@Component注解用于對(duì)那些比較中立的類進(jìn)行注釋;
//相對(duì)與在持久層、業(yè)務(wù)層和控制層分別采用 @Repository、@Service 和 @Controller 對(duì)分層中的類進(jìn)行注釋
@Component
@EnableScheduling   // 1.開啟定時(shí)任務(wù)
@EnableAsync        // 2.開啟多線程
public class MultithreadScheduleTask {

        @Async
        @Scheduled(fixedDelay = 1000)  //間隔1秒
        public void first() throws InterruptedException {
            System.out.println("第一個(gè)定時(shí)任務(wù)開始 : " + LocalDateTime.now().toLocalTime() + "\r\n線程 : " + Thread.currentThread().getName());
            System.out.println();
            Thread.sleep(1000 * 10);
        }

        @Async
        @Scheduled(fixedDelay = 2000)
        public void second() {
            System.out.println("第二個(gè)定時(shí)任務(wù)開始 : " + LocalDateTime.now().toLocalTime() + "\r\n線程 : " + Thread.currentThread().getName());
            System.out.println();
        }
    }

注:?這里的@Async注解很關(guān)鍵

2、啟動(dòng)測(cè)試

啟動(dòng)應(yīng)用后,查看控制臺(tái)

微服務(wù)系列文章 之SpringBoot之定時(shí)任務(wù)詳解,spring boot,微服務(wù),java

?

從控制臺(tái)可以看出,第一個(gè)定時(shí)任務(wù)和第二個(gè)定時(shí)任務(wù)互不影響;

并且,由于開啟了多線程,第一個(gè)任務(wù)的執(zhí)行時(shí)間也不受其本身執(zhí)行時(shí)間的限制,所以需要注意可能會(huì)出現(xiàn)重復(fù)操作導(dǎo)致數(shù)據(jù)異常。

?

?

到了這里,關(guān)于微服務(wù)系列文章 之SpringBoot之定時(shí)任務(wù)詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Spring Boot進(jìn)階(68):如何用SpringBoot輕松實(shí)現(xiàn)定時(shí)任務(wù)?集成Quartz來幫你!(附源碼)

    Spring Boot進(jìn)階(68):如何用SpringBoot輕松實(shí)現(xiàn)定時(shí)任務(wù)?集成Quartz來幫你!(附源碼)

    ????????Quartz是一個(gè)非常流行的開源調(diào)度框架,它提供了許多強(qiáng)大的功能,如定時(shí)任務(wù)調(diào)度、作業(yè)管理、任務(wù)持久化等。而SpringBoot是目前Java開發(fā)中非常流行的框架之一,其對(duì)各種開源框架集成非常方便。本篇文章將介紹如何在SpringBoot中集成Quartz,以便于更好的管理和調(diào)度

    2024年02月07日
    瀏覽(26)
  • 【Linux 服務(wù)器運(yùn)維】定時(shí)任務(wù) crontab 詳解 | 文末送書

    【Linux 服務(wù)器運(yùn)維】定時(shí)任務(wù) crontab 詳解 | 文末送書

    本文思維導(dǎo)圖概述的主要內(nèi)容: 1.1 什么是 crontab Crontab 是一個(gè)在 Unix 和 Linux 操作系統(tǒng)上 用于定時(shí)執(zhí)行任務(wù) 的工具。它允許用戶創(chuàng)建和管理計(jì)劃任務(wù),以便在特定的時(shí)間間隔或時(shí)間點(diǎn)自動(dòng)運(yùn)行命令或腳本。Crontab 是 cron table 的縮寫, cron 指的是 Unix 系統(tǒng)中的一個(gè)后臺(tái)進(jìn)程,它

    2024年02月08日
    瀏覽(129)
  • java中定時(shí)任務(wù) schedule 分布式下沒有鎖住 時(shí)間不同步 執(zhí)行滯后 相對(duì)時(shí)間 系統(tǒng)時(shí)間 spring springboot

    java.util.Timer計(jì)時(shí)器可以進(jìn)行:管理任務(wù)延遲執(zhí)行(“如1000ms后執(zhí)行任務(wù)”),及周期性執(zhí)行(“如每500ms執(zhí)行一次該任務(wù)”)。 但是,Timer存在一些缺陷,應(yīng)考慮使用ScheduledThreadPoolExecutor代替,Timer對(duì)調(diào)度的支持是基于絕對(duì)時(shí)間,而不是相對(duì)時(shí)間的,由此任務(wù)對(duì)系統(tǒng)時(shí)鐘的改變是敏感

    2024年02月10日
    瀏覽(28)
  • 微服務(wù)系列文章之 Springboot+Vue實(shí)現(xiàn)登錄注冊(cè)

    微服務(wù)系列文章之 Springboot+Vue實(shí)現(xiàn)登錄注冊(cè)

    一、springBoot 創(chuàng)建springBoot項(xiàng)目 ? 分為三個(gè)包,分別為controller,service, dao以及resource目錄下的xml文件。 添加pom.xml 依賴 UserController.java ? UserService.java ? User.java (我安裝了lombok插件) ? UserMapper.java ? UserMapper.xml ? 主干配置 application.yaml ? 數(shù)據(jù)庫需要建相應(yīng)得到表 1 2 3 4 CREA

    2024年02月13日
    瀏覽(23)
  • Spring Cloud 微服務(wù)系列文章合集,一次性看個(gè)夠!

    Spring Cloud 微服務(wù)系列文章合集,一次性看個(gè)夠!

    微服務(wù)架構(gòu)圖 為了方便大家可以直接下載編輯,這里用的ProcessOn畫的架構(gòu)圖,可以直接克隆一個(gè)出來進(jìn)行編輯,地址:https://www.processon.com/view/6523a1b37fde9c4bb35c7278 微服務(wù)系列文章合集,點(diǎn)擊閱讀 Spring Cloud 微服務(wù)系列前言 Spring Cloud 微服務(wù)系列包版本號(hào)約定 IntelliJ IDEA 創(chuàng)建多模

    2024年02月08日
    瀏覽(31)
  • 微服務(wù)系列文章 之 nginx日志配置指令詳解

    日志對(duì)于統(tǒng)計(jì)排錯(cuò)來說非常有利的。本文總結(jié)了nginx日志相關(guān)的配置如access_log、log_format、open_log_file_cache、log_not_found、log_subrequest、rewrite_log、error_log。 nginx有一個(gè)非常靈活的日志記錄模式。每個(gè)級(jí)別的配置可以有各自獨(dú)立的訪問日志。日志格式通過log_format命令來定義。ngx_

    2024年02月16日
    瀏覽(23)
  • 微服務(wù)系列文章 之 Nginx狀態(tài)監(jiān)控日志分析詳解

    微服務(wù)系列文章 之 Nginx狀態(tài)監(jiān)控日志分析詳解

    1、Nginx狀態(tài)監(jiān)控 Nginx提供了一個(gè)內(nèi)置的狀態(tài)信息監(jiān)控頁面可用于監(jiān)控Nginx的整體訪問情況,這個(gè)功能由ngx_http_stub_status_module模塊進(jìn)行實(shí)現(xiàn)。 使用nginx -V 21 | grep -o with-http_stub_status_module命令檢測(cè)當(dāng)前Nginx是否有status功能,如果輸出ngx_http_stub_status_module則說明是有的,如果沒有可以

    2024年02月16日
    瀏覽(26)
  • 微服務(wù)系列文章之 Springboot應(yīng)用在k8s集群中配置的使用

    微服務(wù)系列文章之 Springboot應(yīng)用在k8s集群中配置的使用

    Docker部署其實(shí)也可以再docker run或者dockerfile里面,將配置文件目錄映射到宿主機(jī),然后通過宿主機(jī)配置文件修改參數(shù)。 很多時(shí)候Dockerfile文件中需要定義變量,減少對(duì)Dockerfile文件的修改,在編譯的時(shí)候從外部傳入?yún)?shù),這種情況可使用? ARG 參數(shù),然后通過 --build-arg 進(jìn)行賦值。

    2024年02月16日
    瀏覽(22)
  • 架構(gòu)師系列- 定時(shí)任務(wù)(一)- 單機(jī)和分布式定時(shí)任務(wù)比較

    架構(gòu)師系列- 定時(shí)任務(wù)(一)- 單機(jī)和分布式定時(shí)任務(wù)比較

    定時(shí)任務(wù)概述 在很多應(yīng)用中我們都是需要執(zhí)行一些定時(shí)任務(wù)的,比如定時(shí)發(fā)送短信,定時(shí)統(tǒng)計(jì)數(shù)據(jù),在實(shí)際使用中我們使用什么定時(shí)任務(wù)框架來實(shí)現(xiàn)我們的業(yè)務(wù),定時(shí)任務(wù)使用中會(huì)遇到哪些坑,如何最大化的提高定時(shí)任務(wù)的性能。 我們這里主要介紹單機(jī)和分布式兩大類的解

    2024年04月27日
    瀏覽(30)
  • springboot定時(shí)任務(wù):同時(shí)使用定時(shí)任務(wù)和websocket報(bào)錯(cuò)

    springboot定時(shí)任務(wù):同時(shí)使用定時(shí)任務(wù)和websocket報(bào)錯(cuò)

    項(xiàng)目使用了websocket,實(shí)現(xiàn)了消息的實(shí)時(shí)推送。后來項(xiàng)目需要一個(gè)定時(shí)任務(wù),使用org.springframework.scheduling.annotation的@EnableScheduling注解來實(shí)現(xiàn),啟動(dòng)項(xiàng)目之后報(bào)錯(cuò) 打斷點(diǎn) 進(jìn)入代碼發(fā)現(xiàn)是這個(gè)定時(shí)任務(wù)的bean為null 由于先寫的websocket推送消息,運(yùn)行正常。之前一個(gè)項(xiàng)目只有一個(gè)定時(shí)任

    2024年02月11日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包