13-SpringBoot項目使用定時任務

2020-09-24 亮子說編程



1、常用定時器技術

  • Timer:這是java自帶的java.util.Timer類,這個類允許你調度一個java.util.TimerTask任務。使用這種方式可以讓你的程序按照某一個頻度執行,但不能在指定時間運行。一般用的較少。
  • ScheduledExecutorService:也jdk自帶的一個類;是基於線程池設計的定時任務類,每個調度任務都會分配到線程池中的一個線程去執行,也就是說,任務是並發執行,互不影響。
  • Spring Task:Spring3.0以後自帶的task,可以將它看成一個輕量級的Quartz,而且使用起來比Quartz簡單許多。
  • Quartz:這是一個功能比較強大的的調度器,可以讓你的程序在指定時間執行,也可以按照某一個頻度執行,配置起來稍顯複雜。

2、SpringBoot定時任務實現

在SpringBoot中使用定時任務,用到了兩個註解:

  • @EnableScheduling 用來修飾類,表示啟動定時任務
  • @Scheduled 具體定時任務

1)、創建任務類

@Component@EnableSchedulingpublic class TaskWork { }

2)、多種定時機制

  • fixedRate:定義一個按一定頻率執行的定時任務
  • fixedDelay:定義一個按一定頻率執行的定時任務,與上面不同的是,該屬性可以配合initialDelay, 定義該任務延遲執行時間。
  • cron:通過表達式來配置任務執行時間

cron表達式:

一個cron表達式有至少6個(也可能7個)有空格分隔的時間元素。按順序依次為:

  • 秒(0~59)
  • 分鐘(0~59)
  • 3 小時(0~23)
  • 4 天(0~31)
  • 5 月(0~11)
  • 6 星期(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
  • 年份(1970-2099)

其中每個元素可以是一個值(如6),一個連續區間(9-12),一個間隔時間(8-18/4)(/表示每隔4小時),一個列表(1,3,5),通配符。由於」月份中的日期」和」星期中的日期」這兩個元素互斥的,必須要對其中一個設置。

關於Cron表達式介紹

cronExpression定義時間規則,Cron表達式由6或7個空格分隔的時間欄位組成:秒 分鐘 小時 日期 月份 星期 年(可選)

欄位  允許值  允許的特殊字符 秒       0-59     , - * / 分       0-59     , - * / 小時      0-23     , - * / 日期      1-31     , - * ? / L W C 月份      1-12     , - * / 星期      1-7       , - * ? / L C 3」 每月的第三個星期五上午10:15觸發

3)、實現定時任務

@Component@EnableSchedulingpublic class TaskWork { private int workCount = 0; /** * fixedRate 的單位是毫秒 */ @Scheduled(fixedRate = 1000) public void taskCounter() { workCount ++; System.out.println(&34; + workCount); } @Scheduled(cron = &34;) public void taskRun5() throws InterruptedException { Date dNow = new Date( ); SimpleDateFormat ft = new SimpleDateFormat(&34;); System.out.println(Thread.currentThread().getName()+&34;+ft.format(dNow)); }}

3、定時任務重入問題

當一個任務的處理超時時,由於每個任務是單線程的,所以對於定時任務而言,有可能會延遲下一個任務。

當出現這種情況,就需要使用多線程定時任務,可以是使用下面註解來實現:


  • @EnableAsync
  • @Async

具體代碼如下:

package com.shenmazong.bootdemotask.task;import lombok.extern.slf4j.Slf4j;import org.springframework.scheduling.annotation.Async;import org.springframework.scheduling.annotation.EnableAsync;import org.springframework.scheduling.annotation.EnableScheduling;import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Component;import java.util.Date;@Slf4j@Component@EnableScheduling // 1.開啟定時任務@EnableAsync // 2.開啟多線程public class WorkTask { /** * TODO 每秒鐘執行一次任務 */ @Async @Scheduled(fixedRate = 1000) public void fixRateTask() { String strDateTime = new Date().toString(); try { Thread.sleep(1000*30); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+&34;+strDateTime); } /** * TODO 每5秒執行一次任務 */ @Scheduled(cron = &34;) public void fixTimeTask() {// String strDateTime = new Date().toString();//// try {// Thread.sleep(1000*10);// } catch (InterruptedException e) {// e.printStackTrace();// }//// System.out.println(Thread.currentThread().getName()+&34;+strDateTime); }}


相關焦點

  • springboot中定時任務執行Quartz的使用
    環境:springboot2.2.11.RELEASE2種方式執行定時任務1、通過springboot的方式2、使用Quartz實現定時任務方式一:通過springboot的定時任務1、開啟定時任務功能@EnableScheduling
  • Springboot整合quarter定時任務
    ,大致分為三個部分:添加jar包、創建一個定時任務的配置類、創建具體執行的任務,希望看完本文後對大家有所幫助。文章目錄springboot整合quarter定時任務一、添加jar包二、創建一個定時任務的配置類三、創建具體執行的任務
  • 實戰Spring Boot 2.0系列:單機定時任務的幾種實現
    前言定時任務一般會存在 中大型企業級 項目中,為了減少 伺服器、資料庫 的壓力,往往會以 定時任務 的方式去完成某些業務邏輯。常見的就是 金融服務系統推送回調,一般支付系統訂單在沒有收到成功的回調返回內容時會 持續性的回調,這種回調一般都是 定時任務 來完成。
  • SpringBoot定時任務:schedule、quartz
    Scheduled只適合處理簡單的計劃任務,不能處理分布式計劃任務。優勢:是spring框架提供的計劃任務,開發簡單,執行效率比較高。且在計劃任務數量太多的時候,可能出現阻塞,崩潰,延遲啟動等問題。Scheduled定時任務是spring3.0版本之後自帶的一個定時任務。
  • SpringBoot 整合 Quartz 實現 JAVA 定時任務的動態配置
    沒接觸過定時任務的同學可以先看下此篇:JAVA定時任務實現的幾種方式定時任務實現方式千人千種,不過基礎的無外乎 1、JDK 的Timer類 2、Quartz 3、SpringTask 。生產上三種方式我都有使用過。但是使用過程中用的最多的便是xml配置的方式,這種方式最簡單,無代碼侵入,也比較好理解。
  • SpringBoot定時任務EnableScheduling
    新建項目,在pom.xml導入必要的依賴。寫一個SpringBoot的啟動類啟動類裡面使用@EnableScheduling 註解開啟定時任務功能。編寫定時任務要在任務的類上寫@Component,將當前的任務類注入到容器。要在任務方法上寫@Scheduled,然後編寫cron表達式。
  • Spring Boot實現定時任務新解,你是否能get到?
    在日常的開發過程中經常使用到定時任務,在springMVC的開發中,經常和quartz框架進行集成使用,但在springboot中沒有這麼做,而是使用了java的線程池來實現定時任務。一、概述在springboot中使用定時任務非常簡單,只需要簡單的幾步即可完成。
  • springboot之動態修改cron表達式
    前言在實際項目開發中,使用quratz石英鐘定時任務是經常使用到的,定時任務可以根據指定的時間周期性的完成一個任務。我們通常使用的是@Scheduled註解來完成設置定時任務,但是有時候我們往往需要對周期性的時間的設置會做一些改變,那麼這個時候使用此註解就不太方便了,原因在於這個註解中配置的cron表達式必須是常量,那麼當我們修改定時參數的時候,就需要停止服務,重新部署。說明 修改cron定時參數後,不需要重啟伺服器就可以動態修改。
  • SpringBoot項目的controller被其他項目使用
    作者|一個忙來無聊的人|簡書本文基於springboot開發處理在實際操作中,有這麼一個需求,需要編寫一堆接口,能直接打成jar包通過其他項目引入就能使用,而不是傳統的 client 方式進行調用處理;本文通過調研處理實現A springboot項目直接被 B springboot項目使用,並且B Springboot項目還能直接使用A項目的controller(接口),也就是前端能直接通過A 項目部署的jar包同時訪問A、B 項目的所有接口
  • 實戰|SpringBoot實現定時任務的動態增刪啟停
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫作者:jessehua www.jianshu.com/p/0f68936393fd在spring boot項目中,可以通過@EnableScheduling註解和@Scheduled註解實現定時任務,也可以通過SchedulingConfigurer
  • SpringBoot中的定時任務的同步與異步你確定真的知道?
    定時任務調度功能在我們的開發中是非常常見的,隨便舉幾個例子:定時清除一些過期的數據,定時發送郵件等等,實現定時任務調度的方式也十分多樣,本篇文章主要學習各種實現定時任務調度方式的優缺點,以便為日後選擇的時候提供一定的參考。
  • 延遲隊列實現,定時任務,關閉訂單
    場景開發中經常需要用到定時任務,對於商城來說,定時任務尤其多,比如優惠券定時過期、訂單定時關閉、微信支付2小時未支付關閉訂單等等,都需要用到定時任務,但是定時任務本身有一個問題,一般來說我們都是通過定時輪詢查詢資料庫來判斷是否有任務需要執行,也就是說不管怎麼樣,我們需要先查詢資料庫,而且有些任務對時間準確要求比較高的,需要每秒查詢一次,對於系統小倒是無所謂,如果系統本身就大而且數據也多的情況下,這就不大現實了,所以需要其他方式的
  • Novel 1.3.0 發布,新增定時任務
    Novel v1.3.0 已發布,更新日誌: 新增任務調度功能 新增用戶導入功能 新增任務調度信息導出 新增任務調度日誌導出 新增datatable、treetable
  • 不要手動部署SpringBoot項目了,使用Docker真香!
    6.編寫application.yml配置文件server:  port: 9999到這裡springboot項目就創建完成了,我們現在啟動一下項目。項目沒有問題,現在我們將項目拷貝到伺服器中。springboot項目,既然鏡像已經生成,那麼如何使用這個鏡像呢?
  • SpringBoot整合Quartz實現Java定時任務配置
    定時任務實現方式千人千種,不過基礎的無外乎 1、JDK 的Timer類 2、Quartz 3、SpringTask 。生產上三種方式我都有使用過。但是使用過程中用的最多的便是xml配置的方式,這種方式最簡單,無代碼侵入,也比較好理解。但是卻有個致命的缺點,比如你要改某個任務的觸發時間,亦或是你要新增一個任務,暫停一個任務。怎麼做?停應用!改XML配置!重新啟動!
  • springboot+thymeleaf 個人站點開源項目
    如果覺得這個項目不錯,請持續關注,點讚+轉發支持。項目架構JDK版本:至少1.8及以上springboot版本:2.0.1RELEASEthymeleafmybatispagehelper後臺首頁:使用方法
  • 如何使用寶塔面板創建定時任務?
    大家在使用寶塔面板時都可能會遇到需要使用定時任務的功能,在其進行操作網站程式時,例如文件備份、木馬查殺,釋放內存等都會用到定時任務,而用好定時任務功能可以使你工作效率事半功倍。而今天要教給大家的就是如何在SugarHosts雲伺服器上使用寶塔面板創建定時任務。
  • Django動態添加定時任務之django-celery的使用
    定時任務和周期任務在我們日常工作中應用廣泛,例如定時發布、周期巡檢等,通常我們會藉助Linux下的Crontab來實現,但如何將這一功能搬進我們自研的運維系統呢?
  • SPRINGBOOT + RABBITMQ發送郵件100%
    見圖知意二、實現思路簡略介紹163郵箱授權碼的獲取編寫發送郵件工具類編寫RabbitMQ配置文件生產者發起調用消費者發送郵件定時任務定時拉取投遞失敗的消息, 重新投遞各種異常情況的測試驗證拓展: 使用動態代理實現消費端冪等性驗證和消息確認(ack)三、項目介紹springboot版本2.1.5.RELEASE, 舊版本可能有些配置屬性不能使用, 需要以代碼形式進行配置
  • Springboot 項目搭建入門
    Springboot 項目搭建入門環境準備ideamaven工程搭建springboot項目由於其自動配置了很多的依賴,簡化了開發者的配置,因此加快了開發者的開發速度,但是如果對spring 底層等不太了解的人,還是有些懵的,建議大家學習spring 之後再來使用spring boot項目來搭建。