欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java下SpringBoot創(chuàng)建定時(shí)任務(wù)詳解

 更新時(shí)間:2020年07月23日 10:57:45   作者:淼淼之森  
這篇文章主要介紹了Java下SpringBoot創(chuàng)建定時(shí)任務(wù)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

序言

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

  • 一、基于注解(@Scheduled)
  • 二、基于接口(SchedulingConfigurer) 前者相信大家都很熟悉,但是實(shí)際使用中我們往往想從數(shù)據(jù)庫(kù)中讀取指定時(shí)間來(lái)動(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基于注解來(lái)創(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ù)即可。

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

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


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

開啟本地?cái)?shù)據(jù)庫(kù)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 * * * * ?');


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

spring:
 datasource:
 url: jdbc:mysql://localhost:3306/socks
 username: root
 password: 123456

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

數(shù)據(jù)庫(kù)準(zhǔn)備好數(shù)據(jù)之后,我們編寫定時(shí)任務(wù),注意這里添加的是TriggerTask,目的是循環(huán)讀取我們?cè)跀?shù)據(jù)庫(kù)設(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ù)庫(kù)獲取執(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秒一次:

然后打開Navicat ,將執(zhí)行周期修改為每6秒執(zhí)行一次,如圖:


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


注意:如果在數(shù)據(jù)庫(kù)修改時(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):


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

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

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

相關(guān)文章

  • RocketMQ消息存儲(chǔ)文件的加載與恢復(fù)機(jī)制源碼分析

    RocketMQ消息存儲(chǔ)文件的加載與恢復(fù)機(jī)制源碼分析

    這篇文章主要介紹了RocketMQ源碼分析之消息存儲(chǔ)文件的加載與恢復(fù)機(jī)制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • java socket實(shí)現(xiàn)聊天室 java實(shí)現(xiàn)多人聊天功能

    java socket實(shí)現(xiàn)聊天室 java實(shí)現(xiàn)多人聊天功能

    這篇文章主要為大家詳細(xì)介紹了java socket實(shí)現(xiàn)聊天室,java實(shí)現(xiàn)多人聊天功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Java生產(chǎn)者消費(fèi)者的三種實(shí)現(xiàn)方式

    Java生產(chǎn)者消費(fèi)者的三種實(shí)現(xiàn)方式

    這篇文章主要介紹了Java生產(chǎn)者消費(fèi)者的三種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • java使用sigar 遇到問(wèn)題的快速解決方法

    java使用sigar 遇到問(wèn)題的快速解決方法

    下面小編就為大家?guī)?lái)一篇java使用sigar 遇到問(wèn)題的快速解決方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • java基礎(chǔ)類型源碼解析之多角度講HashMap

    java基礎(chǔ)類型源碼解析之多角度講HashMap

    這篇文章主要給大家介紹了關(guān)于java基礎(chǔ)類型源碼解析之HashMap的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java基具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Java多態(tài)(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)

    Java多態(tài)(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)

    多態(tài)是指允許不同類的對(duì)象對(duì)同一消息做出響應(yīng)。即同一消息可以根據(jù)發(fā)送對(duì)象的不同而采用多種不同的行為方式。接下來(lái)通過(guò)本文給大家介紹java多態(tài)相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧
    2017-04-04
  • dubbo之@Reference注解作用說(shuō)明

    dubbo之@Reference注解作用說(shuō)明

    這篇文章主要介紹了dubbo之@Reference注解作用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • java后臺(tái)利用Apache poi 生成excel文檔提供前臺(tái)下載示例

    java后臺(tái)利用Apache poi 生成excel文檔提供前臺(tái)下載示例

    本篇文章主要介紹了java后臺(tái)利用Apache poi 生成excel文檔提供前臺(tái)下載示例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-05-05
  • Spring中Bean的生命周期及實(shí)例化操作詳解

    Spring中Bean的生命周期及實(shí)例化操作詳解

    這篇文章主要介紹了Spring中Bean的生命周期及實(shí)例化操作詳解,spring的核心思想之一IOC就是通過(guò)IOC容器對(duì)Bean的創(chuàng)建和各個(gè)bean之間的依賴關(guān)系進(jìn)行操作,今天就來(lái)和大家分享一下bean的生命周期相關(guān)知識(shí)點(diǎn),需要的朋友可以參考下
    2023-08-08
  • Springboot整合RabbitMQ實(shí)現(xiàn)發(fā)送驗(yàn)證碼的示例代碼

    Springboot整合RabbitMQ實(shí)現(xiàn)發(fā)送驗(yàn)證碼的示例代碼

    這篇文章主要介紹了Springboot整合RabbitMQ實(shí)現(xiàn)發(fā)送驗(yàn)證碼的功能,基于AMQP協(xié)議實(shí)現(xiàn)的消息隊(duì)列,它是一種應(yīng)用程序之間的通信方法,消息隊(duì)列在分布式系統(tǒng)開 發(fā)中應(yīng)用非常廣泛,需要的朋友可以參考下
    2022-02-02

最新評(píng)論