1. 程式人生 > >SpringBoot的定時任務兩種(Spring Schedule 與 Quartz 整合 )實現

SpringBoot的定時任務兩種(Spring Schedule 與 Quartz 整合 )實現

前言

最近在專案中使用到定時任務,之前一直都是使用Quartz 來實現,最近看Spring 基礎發現其實Spring 提供 Spring Schedule 可以幫助我們實現簡單的定時任務功能。
下面說一下兩種方式在Spring Boot 專案中的使用。

Spring Schedule 實現定時任務

Spring Schedule 實現定時任務有兩種方式 1. 使用XML配置定時任務, 2. 使用 @Scheduled 註解。 因為是Spring Boot 專案 可能儘量避免使用XML配置的形式,主要說註解的形式.

Spring Schedule 提供三種形式的定時任務:

固定等待時間 @Scheduled(fixedDelay = 時間間隔 )

@Component
public class ScheduleJobs {
    public final static long SECOND = 1 * 1000;
    FastDateFormat fdf = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss");


    @Scheduled(fixedDelay = SECOND * 2)
    publicvoidfixedDelayJob() throws InterruptedException {
        TimeUnit.SECONDS.sleep(2);
        System.out
.println("[FixedDelayJob Execute]"+fdf.format(new Date())); } }

固定間隔時間 @Scheduled(fixedRate = 時間間隔 )

@Component
public class ScheduleJobs {
    public final static long SECOND = 1 * 1000;
    FastDateFormat fdf = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss");


    @Scheduled(fixedRate = SECOND * 4
) publicvoidfixedRateJob() { System.out.println("[FixedRateJob Execute]"+fdf.format(new Date())); } }

Corn表示式 @Scheduled(cron = Corn表示式)

@Component
public class ScheduleJobs {
    public final static long SECOND = 1 * 1000;
    FastDateFormat fdf = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss");


    @Scheduled(cron = "0/4 * * * * ?")
    publicvoidcronJob() {
        System.out.println("[CronJob Execute]"+fdf.format(new Date()));
    }
}

Spring Boot 整合 Quartz 實現定時任務

新增Maven依賴

        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>

Spring Boot 整合 Quartz

Spring 專案整合 Quartz 主要依靠新增 SchedulerFactoryBean 這個 FactoryBean ,所以在maven 依賴中新增 spring-context-support 。

首先新增 QuartzConfig 類 來宣告相關Bean

@Configuration
public class QuartzConfig {
    @Autowired
    private SpringJobFactory springJobFactory;

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean() {
        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        schedulerFactoryBean.setJobFactory(springJobFactory);
        return schedulerFactoryBean;
    }

    @Bean
    public Scheduler scheduler() {
        return schedulerFactoryBean().getScheduler();
    }
}

這裡我們需要注意 我注入了一個 自定義的JobFactory ,然後 把其設定為SchedulerFactoryBean 的 JobFactory。其目的是因為我在具體的Job 中 需要Spring 注入一些Service。
所以我們要自定義一個jobfactory, 讓其在具體job 類例項化時 使用Spring 的API 來進行依賴注入。

SpringJobFactory 具體實現:

@Component
public class SpringJobFactory extends AdaptableJobFactory {

    @Autowired
    private AutowireCapableBeanFactory capableBeanFactory;

    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        Object jobInstance = super.createJobInstance(bundle);
        capableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
    }
}

具體使用 (摘取自專案程式碼):


@Service
public class QuartzEventServiceImpl implements QuartzEventService {
    private static final String JOB_GROUP = "event_job_group";
    private static final String TRIGGER_GROUP = "event_trigger_group";
    @Autowired
    private Scheduler scheduler;

    @Override
    publicvoidaddQuartz(Event event) throws SchedulerException {
        JSONObject eventData = JSONObject.parseObject(event.getEventData());
        Date triggerDate = eventData.getDate("date");
        JobDetail job = JobBuilder.newJob(EventJob.class).withIdentity(event.getId().toString(), JOB_GROUP).usingJobData(buildJobDateMap(event)).build();
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity(event.getId().toString(), TRIGGER_GROUP).startAt(triggerDate).build();
        scheduler.scheduleJob(job, trigger);
    }
原文連結:http://www.cnblogs.com/javanoob/p/springboot_schedule.html

相關推薦

SpringBoot之旅 -- 定時任務(Spring Schedule Quartz 整合 )實現

目的 config object cnblogs java title cor 進行 eat 相關文章 Spring Boot 相關文章目錄 前言 最近在項目中使用到定時任務,之前一直都是使用Quartz 來實現,最近看Spring 基礎發現其實Spring 提供

SpringBoot定時任務(Spring Schedule Quartz 整合 )實現

前言 最近在專案中使用到定時任務,之前一直都是使用Quartz 來實現,最近看Spring 基礎發現其實Spring 提供 Spring Schedule 可以幫助我們實現簡單的定時任務功能。 下面說一下兩種方式在Spring Boot 專案中的使用。 Spring

spring 定時任務方式

一    springMVC自帶task啟動後加載   上程式碼 首先新增依賴引入task <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.o

springquartz整合實現分布式動態創建,刪除,改變執行時間定時任務(mysql數據庫)

ces value 我們 job clu xsd collect 註解 common 背景:因為在項目中用到了定時任務,當時想到了spring的quartz,寫完發現費了很大功夫,光是整合就花了一上午,其中最大的問題就是版本問題,項目中用的是spring3.2.8的版本,查

分散式深度學習的叢集管理排程的實現方式簡介

為什麼需要叢集管理與排程上文我們簡單介紹了深度學習、分散式CPU+GPU叢集的實現原理,以及分散式深度學習的原理,我們簡單回顧一下:分散式CPU+GPU叢集的實現:GPU叢集並行模式即為多GPU並行中各種並行模式的擴充套件,如上圖所示。節點間採用InfiniBand通訊,節點

Spring BootQuartz整合

1.匯入依賴包 <!-- quartz定時器 --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artif

OozieCoordinator調度講解及系統時區配置定時觸發配置方式

-- track eno star es2017 alt coo 之前 res 1:修改本地linux時區 查看時區 - 號代表西 + 號 代表東 北京時間是東八區 設置時區的配置文件所在位置 1 cd /usr/share/zoneinfo/

SpringBoot定時任務Schedule使用

在開發中很多時候會用到定時任務, 以前用自定義類繼承TimerTask public class CustomTask extends TimerTask{ @Override public void run() { // 執行業務程式碼 }

springboot 定時任務schedule

測試版本 1.5 和 2.0.4 完全一樣   兩步 1. 配置類 2.job   1、配置類 import org.springframework.context.annotation.Bean; import org.springframework.context

SpringBoot定時任務Schedule (七)

在日常專案執行中,我們總會有需求在某一時間段週期性的執行某個動作。比如每天在某個時間段匯出報表,或者每隔多久統計一次現在線上的使用者量。在springboot中可以有很多方案去幫我們完成定時器的工作,有Java自帶的java.util.Timer類,也有強大的排程器Quart

springboot動態配置定時任務2方式,整合Quartz多執行緒併發執行多個定時任務配置

我的專案是採用的idea+gradle+springboot專案構建,下面是springboot實現定時任務所需要的jar包 //定時任務使用 compile group: 'org.quartz-scheduler', name: 'quartz', version:

spring整合quartz實現動態定時任務的前臺網頁配置管理

在實際專案應用中經常會用到定時任務,可以通過quartz和spring的簡單配置即可完成,但如果要改變任務的執行時間、頻率,廢棄任務等就需要改變配置甚至程式碼需要重啟伺服器,這裡介紹一下如何通過quartz與spring的組合實現動態的改變定時任務的狀態的一個實

(原創)js,ajaxspringboot之間的傳參方式

目前實現的有兩種傳參方式。請先理解,勿單純複製貼上。 方式一: 前端js: function update(){ var d = {}; d.userId = 30; d.username = "Sunpeng.Guo";

Spring整理系列(08)——springquartz整合執行定時任務

專案基於maven進行管理。 一、例項專案程式碼示例: 1、pom.xml檔案所需要的基本jar: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.

C/S和B/S架構區別優缺點分析

iis 持久化數據 邏輯 刷新 lamp 滿足 tle 擴展 區別 C/S和B/S,是再普通不過的兩種軟件架構方式,都可以進行同樣的業務處理,甚至也可以用相同的方式實現共同的邏輯。既然如此,為何還要區分彼此呢?那我們就來看看二者的區別和聯系。 一、C/S 架構

springboot定時任務

factor 添加 actor 返回值 olt adp 思路分析 web ack (1)思路說明; (a)首先這裏我們需要重新認識一個類ThreadPoolTaskScheduler:線程池任務調度類,能夠開啟線程池進行任務調度。 (b)ThreadPoolTaskSche

springboot定時任務,去掉指定日期

bstr log tex ram static 依賴 測試 form 意思   今天用springboot寫到一個需求:每周定時發送任務,但是要避開法定節假日。   網上找了些博客看,主要參考了https://www.cnblogs.com/lic309/p/4089633

cron 定時配置方式

card 任務 init 1-1 rop java代碼 exp tor date 第一種:xml文件方式 <bean id="commonTimer" class="com.course.wx.timer.CommonTimer"></bean&

在Listener(監聽器)定時啟動的TimerTask(定時任務)中使用Spring@Service註解的bean

什麽 Language out 獲得 自動 location ext exti 方法 1.有時候在項目中需要定時啟動某個任務,對於這個需求,基於JavaEE規範,我們可以使用Listener與TimerTask來實現,代碼如下: public class TestTask

SpringBoot 定時任務的使用

系統啟動 單獨 initial 2.2.3 cond 調用 串行 context tco 一點知識在JAVA開發領域,目前可以通過以下幾種方式進行定時任務: Timer:jdk中自帶的一個定時調度類,可以簡單的實現按某一頻度進行任務執行。提供的功能比較單一,無法實現復雜的調