1. 程式人生 > >Spring 和 Quartz 實現定時任務

Spring 和 Quartz 實現定時任務

注:文中示例和總結源自結尾的參考部落格,感謝各位博主的分享

Quartz是一個開源的,用於處理定時任務的專案,因為相比於Java本身的Timer功能更強大一些,而且和Spring整合在了一起,所以應用廣泛。我正好最近接觸到的任務中碰到了它,做個記錄

Java 定時的四種方式

  1. 使用Java自帶的定時器Timer,自己實現TimerTask(抽象類,擴充套件了Runnable),傳入Timer的方法中,進行排程,缺點是不能滿足類似於“在某時某刻執行”的要求,另外可能出現定時不準,因為Timer是單執行緒的,所以就和JS的定時器一樣,存在延遲
  2. 接著1說,改進是可以通過Java的執行緒池ScheduledThreadPoolExecutor
    來替代,可以指定多執行緒,消除定時不準的問題
  3. 使用Quartz,也就是本文接下來要講的
  4. 使用Spring3.0後自帶的Task,類似於Quartz,接下來也會介紹

Quartz

使用Quartz分兩種:繼承QuartzJobBean和不繼承的,二者僅編寫定時任務類和xml配置作業類兩步不同
使用Quartz的一個注意點是:與Spring3.1以下版本整合必須使用Quartz1,因為Spring3.0版本以下,有一個類繼承自Quartz1版本的類,在Quartz更高版本,那個類被改為介面了(見結尾參考部落格:Spring與Quartz的整合實現定時任務排程

使用的步驟分為以下幾個:

對於繼承QuartzJobBean
,需要做

1. 需要實現定時任務的類繼承org.springframework.scheduling.quartz.QuartzJobBean,實現定時執行的方法,xml裡要麼宣告這個定時任務類,要麼使用註解掃描的方式宣告

2. xml裡宣告新的bean,class為org.springframework.scheduling.quartz.JobDetailBean

描述定時任務類,例如:

<bean name="job" class="org.springframework.scheduling.quartz.JobDetailBean">  
    <property
name="jobClass" value="com.example.QuartzTimer" />
<!-- 這個屬性,指定定時任務類 --> <property name="jobDataAsMap"><!-- 這個屬性,為定時任務類注入屬性,注意對應定時任務類,需要有屬性的set方法 --> <map> <entry key="timeout" value="0" /> </map> </property> </bean>

對於不繼承,需要做

1. 需要實現定時任務的類,主要是實現定時執行的方法

2. xml裡使用MethodInvokingJobDetailFactoryBean配置作業類,例如

<bean id="job" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
    <property name="targetObject">  
        <bean class="com.example.QuartzTimer" />  <!-- 這個屬性,指定定時任務類 -->
    </property>  
    <property name="targetMethod" value="doJob" />  
    <property name="concurrent" value="false" /><!-- 作業不併發排程 -->  
</bean>  

接下來的三步,都一樣

3. xml裡配置觸發器Trigger,用於指定什麼時候執行定時任務

觸發器分兩種:org.springframework.scheduling.quartz.SimpleTriggerBeanorg.springframework.scheduling.quartz.CronTriggerBean。其中SimpleTriggerBean只支援按頻率觸發,比如每隔多長時間執行一次,而CronTriggerBean支援使用Cron表示式,指定類似“在每幾天的什麼時間執行”的觸發

這裡需要注意的是,觸發器Trigger和定時任務的對應關係:一個觸發器只能關聯一個定時任務,但是一個定時任務可以關聯多個觸發器(定時任務類對觸發器為多對一)
xml配置例如:

<!--  -->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">  
    <property name="jobDetail" ref="job" />  
    <property name="startDelay" value="0" /><!-- 排程工廠例項化後,經過0秒開始執行排程 -->  
    <property name="repeatInterval" value="2000" /><!-- 每2秒排程一次 -->  
</bean> 

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">  
    <property name="jobDetail" ref="job" />  
    <!-- 每天12:00執行一次 -->  
    <property name="cronExpression" value="0 0 12 * * ?" />  
</bean> 

4. xml裡配置排程工廠Scheduler,統一排程觸發器的地方

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
    <property name="triggers"><!-- 所有的觸發器配到這裡,由排程工廠統一排程 -->
        <list>
            <ref bean="simpleTrigger"/>
            <ref bean="cronTrigger" /> 
        </list>  
    </property>  
</bean>  

最後,關於使用Quartz的最後一點,我們也可以繼承TimerTask,實現定時任務的邏輯,然後通過xml裡宣告org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean,指向這個類,其他觸發器排程工廠,配置不變的方式,實現定時任務。

使用Spring的Task

Spring引入註解後,很多功能都可以通過註解來配置完成了,當然xml的配置方式也保留了下來,Task也不例外
首先,不管xml方式還是註解方式,都需要在xml配置檔案的檔案頭加入名稱空間和描述

xml檔案,檔案頭裡新加入名稱空間

xmlns:task="http://www.springframework.org/schema/task"

xsi:schemaLocation="http://www.springframework.org/schema/task
     http://www.springframework.org/schema/task/spring-task-3.0.xsd

xml方式

1. 實現定時任務類,通過xml配置或者註解,宣告這個類

2. 配置任務

 <task:scheduled-tasks>   
        <!-- job為定時任務類,通過xml配置或者註解方式聲明瞭得 -->
        <task:scheduled ref="job" method="someMethod" cron="0 15 * * * ?"/> 
</task:scheduled-tasks>  

註解方式

1. 實現定時任務類,然後對方法加上Scheduled註解,裡面還可配置cron表示式,或者固定延遲時間、固定頻率

例如:

@Scheduled(cron = "0 0 3 * * ?")  
public void task() {  
    System.out.println(“任務進行中。。。”);  
}  

2. xml裡配置task

<task:executor id="executor" pool-size="5" />  
<task:scheduler id="scheduler" pool-size="10" />  
<!-- 開啟這個配置,spring才能識別@Scheduled註解   --> 
<task:annotation-driven executor="executor" scheduler="scheduler" />

參考部落格

相關推薦

Spring Quartz 實現定時任務

注:文中示例和總結源自結尾的參考部落格,感謝各位博主的分享 Quartz是一個開源的,用於處理定時任務的專案,因為相比於Java本身的Timer功能更強大一些,而且和Spring整合在了一起,所以應用廣泛。我正好最近接觸到的任務中碰到了它,做個記錄

SpringMVC整合Quartz實現定時任務Spring自帶Task定時任務

在java中我們常用Timer和TimerTask實現定時功能,而在JavaEE專案中可以使用Spring整合Quartz定時器、Spring的Task任務。相比於Spring自帶的任務,Quartz非

SpringQuartz實現定時任務排程

Corn表示式 一、增加所依賴的JAR包 1. 增加Spring的Maven依賴 <dependency>  <groupId>org.springframework</groupId>  

Spring整合quartz實現定時動態任務

comm 通過 app 定時器 表示 時間 con 任務 images 在Spring中使用Quartz有兩種方式實現:第一種是任務類繼承QuartzJobBean,第二種則是在配置文件裏定義任務類和要執行的方法,類和方法可以是普通類。很顯然,第二種方式遠比第一種方式來的靈

Spring+Quartz實現定時任務的配置方法

detail 包含 範例 empty beans ref tail 可選 creat 1、Scheduler的配置 <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"&g

Spring配置Quartz實現定時排程任務

一 Quartz 一個開源的作業排程框架,配置執行定時任務 二 配置 1 依賴 <dependency>     <groupId>org.quartz-scheduler</groupId>     <artifactId>

spring中輕鬆實現定時任務,quartz表示式的線上Cron表示式生成器推薦

東西雖簡單,保留下來,開箱即用,省時省力!!!!! 1.首先在pom.xml中引入quartz相關包  <dependency>               <groupId>org.quartz-scheduler</groupId>

spring quartz實現定時任務、延時任務的動態增、刪、改、查

配置見前面兩篇部落格 首先我需要的quartz相關的資訊包括任務名稱、任務組名稱、作業開始時間、作業結束時間等,定義一個類UniQuartzBean用於儲存這些屬性: import java.util.Date; public class UniQuartzBean {

Spring+quartz實現定時任務叢集

1.準備環境(以maven為例,如果不是請自行下載需要的jar包) <!-- quartz定時排程器 --> <dependency> <groupId>org.quartz-scheduler&l

Spring+Quartz實現定時任務

DEBUG 2018-01-19 15:56:45,822 org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor: Could not find default TaskScheduler bean org

spring boot 整合quartz實現定時任務排程

1.pom檔案引入 <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId&

Spring Boot整合quartz實現定時任務並支援切換任務資料來源

org.quartz實現定時任務並自定義切換任務資料來源 在工作中經常會需要使用到定時任務處理各種週期性的任務,org.quar

使用Spring的@Scheduled實現定時任務

特殊字符 scheduled class hat table clas ng- ould color 轉載: Spring配置文件xmlns加入 xmlns:task="http://www.springframework.org/schema/task" xsi:sc

.Net Core小技巧 - Hosted Services + Quartz實現定時任務調度

TBase 觸發 控制 soft ghost .so 不錯 什麽 ora 背景   之前一直有朋友問,.Net Core + Linux環境有沒有類似Windows服務的東西。其實是有的,我了解的方法有兩種:   #1 創建一個ASP.Net Core的Web項目

java+Quartz實現定時任務

1、首先:匯入quartz相關的jar包,這裡我用的是maven構建的專案,pom.xml檔案匯入如下: <dependency> <groupId>org.quartz-scheduler</groupId> <artifactI

spring結合quartz實現定時排程

quartz所需jar包 <!-- 定時任務quartz --> <dependency> <groupId>org.quartz-scheduler</groupId>    <artifactId>qua

使用Quartz實現定時任務

一:Quertz的用途   Quertz是一個開源的作業任務排程框架,他可以完成像JavaScript定時器類式的功能,其實Java中Timer也可實現部分功能,但相比Quertz還是略遜一籌,本人這次需要解決的就是定期統計消費記錄的功能。你還可以用他完成定期執行各類操作的功能。比如 想每月2

SpringBoot+quartz實現定時任務

首先明白Quartz核心概念會變得很容易理解配置. 1、Job 表示一個工作,要執行的具體內容。此介面中只有一個方法 void execute(JobExecutionContext context) 2、JobDetail JobDetail表示一個具體的可執行的排程程式,Jo

spring引入quartz定時任務 MethodInvokingJobDetailFactoryBean的方法

spring整合quartz的方法有兩個 下面我們將用 MethodInvokingJobDetailFactoryBean進行整合一遍 任務類可以不實現Job介面,通過targetMethod指定呼叫方法- 1.引入pom檔案中的依賴 <dependency>

Sprinboot整合Quartz實現定時任務排程管理

Sprinboot整合Quartz實現定時任務排程管理 版本說明: springboot版本:2.0.0.RELEASE quartz版本:2.3.0 github地址:https://github.com/shirukai/quartz-demo.git