Spring 和 Quartz 實現定時任務
注:文中示例和總結源自結尾的參考部落格,感謝各位博主的分享
Quartz是一個開源的,用於處理定時任務的專案,因為相比於Java本身的Timer功能更強大一些,而且和Spring整合在了一起,所以應用廣泛。我正好最近接觸到的任務中碰到了它,做個記錄
Java 定時的四種方式
- 使用Java自帶的定時器Timer,自己實現TimerTask(抽象類,擴充套件了Runnable),傳入Timer的方法中,進行排程,缺點是不能滿足類似於“在某時某刻執行”的要求,另外可能出現定時不準,因為Timer是單執行緒的,所以就和JS的定時器一樣,存在延遲
- 接著1說,改進是可以通過Java的執行緒池
ScheduledThreadPoolExecutor
- 使用Quartz,也就是本文接下來要講的
- 使用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.SimpleTriggerBean
和org.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非
Spring和Quartz實現的定時任務排程
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