在Spring中使用JDK定時器實現排程任務
在Spring中使用JDK定時器實現排程任務
作者:chszs,轉載需註明。部落格主頁:http://blog.csdn.net/chszs
本文探討Spring如何整合JDK的Timer定時器,實現計劃執行任務。
有時候,需要執行一些無使用者互動的程式,就像在指定的時間間隔後臺執行程式那樣。比如,防毒軟體可以每隔2天就在後臺執行一次。又比如某些程式每天都要連線一次伺服器,檢視有沒有更新。
本文探討Spring如何整合JDK的Timer定時器,實現計劃執行任務。
一、Spring框架整合JDK的Timer
JDK的Timer任務物件提供了在指定時間執行任何任務的功能。我們來看下面的例子:
假設我們想寫一個服務,此服務週期性的檢查網際網路連線,並用日誌記錄連線的狀態。讓我們假定此服務是全天候執行的,且每隔30秒執行一次。
所需要的JAR包如下:
log4j-1.2.13.jar
commons-logging-1.1.1.jar
spring-beans-3.2.4.RELEASE.jar
spring-context-3.2.4.RELEASE.jar
spring-context-support-3.2.4.RELEASE.jar
spring-core-3.2.4.RELEASE.jar
spring-expression-3.2.4.RELEASE.jar
二、寫服務類
下面的類實現了網際網路連線檢查。
Listing 1: CheckInternetConnectionService.java
package com.chszs;
import java.net.URL;
import java.net.URLConnection;
import java.util.Date;
public class CheckInternetConnectionService {
public void checkConnection(){
if(doCheck()){
System.out.println(new Date() + "Internet connection available");
}else{
System.out.println(new Date() + "Internet connection not available");
}
}
private boolean doCheck(){
URL urlObject = null;
URLConnection urlConnection = null;
try{
urlObject = new URL("http://www.baidu.com");
urlConnection = urlObject.openConnection();
urlConnection.getContent();
return true;
}catch(Exception e){
return false;
}
}
}
上面的程式碼很簡單,doCheck()方法檢查網際網路連線是否有效。
三、封裝定時器任務服務
下面我們寫一個服務,實現定時任務。程式碼如下:
Listing 2: CheckInternetConnectionWithTimerTask
package com.chszs;
import java.util.TimerTask;
public class CheckInternetConnectionWithTimerTask extends TimerTask{
private CheckInternetConnectionService service;
public CheckInternetConnectionService getService(){
return service;
}
public void setService(CheckInternetConnectionService service){
this.service = service;
}
@Override
public void run() {
service.checkConnection();
}
}
此類繼承了java.util.TimerTask類。
重寫了run()方法,可以執行任意操作。這裡是呼叫網際網路連線檢查。
注意定時器任務依賴於連線服務物件。稍後,我們將看到怎樣連線這兩個物件。
四、配置
至今,我們還沒有指定執行的時間間隔。Spring提供了這樣的配置支援。下面我們來看看該如何配置:
Listing 3: timer.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:cache="http://www.springframework.org/schema/cache" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="connectionCheckService" class="com.chszs.CheckInternetConnectionService">
</bean>
<bean id="connectionCheckTimerTask" class="com.chszs.CheckInternetConnectionWithTimerTask">
<property name="service" ref="connectionCheckService" />
</bean>
<bean id="scheduledConnectionCheckTimerTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="delay" value="2000" />
<property name="period" value="30000" />
<property name="timerTask" ref="connectionCheckTimerTask" />
</bean>
<bean class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<ref bean="scheduledConnectionCheckTimerTask" />
</list>
</property>
</bean>
</beans>
以上配置檔案的細節:
“connectionCheckService”這個Bean表示網際網路連線服務。
“connectionCheckTimerTask”這個Bean定義了定時器任務。由於此定時器任務依賴於”connectionCheckService”這個Bean,故通過配置進行注入。
下面的程式碼是從Spring框架中宣告定時器任務的排程物件:
<bean id="scheduledConnectionCheckTimerTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="delay" value="2000" />
<property name="period" value="30000" />
<property name="timerTask" ref="connectionCheckTimerTask" />
</bean>
org.springframework.scheduling.timer.ScheduledTimerTask這個類提供了對定時任務排程執行的支援。
屬性delay的單位是毫秒,它指定任務執行前需要延時多少時間。2000意味著延時2秒開始執行任務。
第二個屬性period的單位也是毫秒,它表示任務每隔多少時間就重複執行一次。30000這個值表示每隔30秒執行一次。
最後一個屬性是timerTask,它指定實際要執行的任務。
觸發排程任務是通過TimerFactoryBean進行的。它可以指定待排程的任務物件列表,儘管這裡只有1個待排程的任務物件。
<bean class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<ref bean="scheduledConnectionCheckTimerTask" />
</list>
</property>
</bean>
五、客戶端
客戶端程式會載入應用程式的上下文。一旦上下文被載入,服務物件、定時器任務物件、排程的定時器任務物件都會被載入並連線。下面我們繼續介紹觸發器Bean是如何觸發定時器任務的執行,網際網路連線在每隔30秒執行一次。
Listing 4: Client.java
package com.chszs;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Client {
public static void main(String[] args){
ApplicationContext ctx = new ClassPathXmlApplicationContext("timer.xml");
}
}
執行Client.java,可以看到每隔30秒定時器任務就排程執行一次。
執行結果如下:
Sun Aug 11 21:08:26 CST 2013Internet connection available
Sun Aug 11 21:08:56 CST 2013Internet connection available
Sun Aug 11 21:09:26 CST 2013Internet connection available
Sun Aug 11 21:09:56 CST 2013Internet connection available
相關文章
- 使用Java實現定時任務排程Java
- Spring排程定時任務的方式Spring
- 深入 Java Timer 定時任務排程器實現原理Java
- Android 中的定時任務排程Android
- 使用RestCloud ETL Shell元件實現定時排程DataX離線任務RESTCloud元件
- Linux 定時任務排程Linux
- laravel框架任務排程(定時執行任務)Laravel框架
- Java定時任務排程詳解Java
- Crontab定時任務排程介紹
- 基於Azkaban的任務定時排程實踐
- Spring+quartz 實現定時任務Springquartz
- Spring 指南(排程任務)Spring
- Spring Boot系列之使用@Scheduled實現定時任務Spring Boot
- 用海豚排程器定時排程從Kafka到HDFS的kettle任務指令碼Kafka指令碼
- 如何在Java中實現非同步任務排程?Java非同步
- Java後端開發中的任務排程:使用Spring Batch實現批處理Java後端SpringBAT
- 利用排程任務定時刪除分割槽
- Spring Boot 中實現定時任務的兩種方式Spring Boot
- Spring Boot Quartz 分散式叢集任務排程實現Spring Bootquartz分散式
- 在 JS 中如何排程後臺任務?JS
- Spring Boot之使用Scheduled註解實現定時任務Springboot
- NET作業排程(定時任務)-Quartz.Netquartz
- Linux中如何實現定時任務Linux
- Spring Boot應用中進行任務排程Spring Boot
- Java中的定時任務最佳化:從Cron表示式到高精度排程的實現Java
- Spring 整合 Quartz 實現動態定時任務Springquartz
- spring boot中的定時任務Spring Boot
- 定時任務的實現
- Laravel + Workerman 實現多程式定時器任務Laravel定時器
- java springboot 實現定時器任務JavaSpring Boot定時器
- 任務排程
- Spring 定時任務Spring
- Spring Boot入門(三):使用Scheduled註解實現定時任務Spring Boot
- celery 與 flask 實現非同步任務排程Flask非同步
- Spring中Quartz排程器的使用Springquartz
- Spring Boot 實現定時任務的 4 種方式Spring Boot
- 初識spring與quartz整合實現定時任務Springquartz
- oracle job使用方法--實現定時任務Oracle