java中JOB介紹與Spring中JOB的配置

來源:互聯網
上載者:User

標籤:

 

2013-09-05 15:30:54| 分類: 預設分類 |舉報|字型大小 訂閱
1定時器的作用
在實際的開發中,如果項目中需要定時執行或者需要重複執行一定的工作,定時器顯現的尤為重要。
當然如果我們不瞭解定時器就會用線程去實現,例如:
package org.lzstone.action
public class FinanceAction extends Thread{
private Date date;
public void run{
try{
while(true){
Thread.sleep((int)(Math.random()*1000));
date = new Date();
//定時執行任務
}
}catch(Exception e){
e.printStackTrace();
}
}
}
自己實現定時器的工作很複雜,如果實現不好佔用記憶體過多,系統就此Over,所以處理定時執行或者重複執行的任務,定時器是很好的選擇
2.java中常見的定時器
1)藉助Java.util.Timer來實現
2)OpenSymphony社區提供的Quartz來實現
3.介紹Timer
利用Timer開發定時任務是主要分為兩個步驟:
1)建立定時任務類
範例程式碼:
package org.lzstone.action
import java.util.TimeTask
public class LzstoneTimeTask extends TimeTask{
public void run(){
//執行的定時器任務
}
}
2)運行定時任務,運行定時任務分為兩種方式:
2.1)程式直接啟動
範例程式碼:
package org.lzstone.action
public class LzstoneMain{
.......
public void run(){
//執行定時器的任務
//建立執行個體
Timer timer = new Timer();
參數:
new LzstoneTimeTask()- 所要安排的任務。
0- 執行任務前的延遲時間,單位是毫秒。
1*1000- 執行各後續任務之間的時間間隔,單位是毫秒。
timer.schedule(new LzstoneTimeTask(),0,1*1000);
}
}
2.2)web監聽方式
範例程式碼:
package org.lzstone.action
public class LzstoneMain implements ServletContextListener{
private Timer timer = null;
//初始化監聽器,建立執行個體,執行任務
public void contextInitialized(ServletContextEvent event){
timer = new Timer();
timer.schedule(new LzstoneTimeTask(),0,1*1000);
}
//銷毀監聽器,停止執行任務
public void contextDestroyed(ServletContextEvent event){
//注意,在此計時器調用的計時器任務的 run 方法內調用此方法,就可以絕對確保正在執行的任務是此計時器所執行的最後一個任務。
timer.cancel();
}
}
web.xml配置
<listener>
<listener-class>
org.lzstone.action.LzstoneMain
</listener-class>
</listener>
4. 介紹Quartz
Quartz是OpenSymphony開源組織在Job scheduling領域又一個開源項目,可以用來建立簡單或者複雜的定時任務,利用Quartz開發定時任務的步驟與Timer類

似。

利用Quartz開發定時任務是主要分為兩個步驟:
1)建立定時任務類
範例程式碼:
package org.lzstone.action
public class LzstoneTimeTask implements Job{
public void execute(JobExecutionContext context) throws JobExecutionException{
//執行的定時器任務
}
}
2)運行定時任務,運行定時任務分為兩種方式:
2.1)程式直接啟動,建立任務調度器及配置相應的任務計劃
範例程式碼:
package org.lzstone.action
public class LzstoneMain{
private static Scheduler sched;
public static void run() throws Exception{
//建立LzstoneTimeTask的定時任務
JobDetail jobDetail = new JobDetail("lzstoneJob",sched.DEFAULT_GROUP,LzstoneTimeTask.class);
//目標 建立任務計劃
CronTrigger trigger = new CronTrigger("lzstoneTrigger","lzstone","0 0 12 * * ?");
//0 0 12 * * ? 代表每天的中午12點觸發
sched = new org.quartz.impl.StdSchedulerFactory().getScheduler();
sched.scheduleJob(jobDetail,trigger);
sched.start();
}
//停止
public static void stop() throws Exception{
sched.shutdown();
}
}
//執行
public class Main{
.............
public void run(){
LzstoneMain.run();
}
............
}
2.2)web監聽方式
範例程式碼:
package org.lzstone.action
public class LzstoneMainListener implements ServletContextListener{
private Timer timer = null;
//初始化監聽器,建立執行個體,執行任務
public void contextInitialized(ServletContextEvent event){
LzstoneMain.run();
}
//銷毀監聽器,停止執行任務
public void contextDestroyed(ServletContextEvent event){
LzstoneMain.stop();
}
}
web.xml配置
<listener>
<listener-class>
org.lzstone.action.LzstoneMainListener
</listener-class>
</listener>
5.對比
Timer方式實現定時器,原理簡單,實現方便,在執行簡單的任務比較方便,不足之處是無法確定執行時間,並且依賴性比較強,必須繼承指定的類
Quartz方式實現定時器,方便,清晰指定啟動時間,定時參數比較靈活,容易實現比較複雜的定時任務,不足之處是需要實現特定介面,載入其架構
兩種方式各有優缺點,在特定場合可以根據其特點選擇使用。
6.Spring定時任務
Spring定時任務對Timer與Quartz都提供了支援,並且實現步驟基本一樣
首先配置Spring對Timer的支援
1.1 建立定時任務類
package org.lzstone.action
import java.util.TimeTask
public class LzstoneTimeTask extends TimeTask{
public void run(){
//執行的定時器任務
}
}
1.2 註冊定時任務類,配置任務計劃與任務調度器
在項目的WEB-INF下面建立TimerConfig.xml檔案
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean>
<!--註冊定時執行任務實體-->
<bean id="lzstoneTimeTask" class="org.lzstone.action.LzstoneTimeTask"/>
<!--註冊定時器資訊-->
<bean id="taskInfo" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<!--第一次執行任務前需要等待的時間,這裡設定為3秒-->
<property name="delay">
<value>3000</value>
</property>
<!--設定任務的執行循環 這裡設定為4秒-->
<property name="period">
<value>4000</value>
</property>
<!--設定具體執行的任務 這裡設定為lzstoneTimeTask-->
<property name="timerTask">
<ref local="lzstoneTimeTask"/>
</property>
</bean>
<!--配置定時器任務的調度器-->
<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
<!--註冊定時器列表-->
<property name="scheduledTimerTasks">
<list>
<ref local="taskInfo"/>
........
</list>
</property>
</bean>
</beans>
1.3 web項目中的啟動設定
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/TimerConfig.xml</param-value>
</context-param>

<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
配置Spring對Quartz的支援
2.1 建立定時任務類
package org.lzstone.action
public class LzstoneQuartzTask{
public void execute(){
//執行的定時器任務
}
}
2.2 註冊定時任務類,配置任務計劃與任務調度器
在項目的WEB-INF下面建立QuartzConfig.xml檔案
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean>
<!--註冊定時執行任務實體-->
<bean id="lzstoneQuartzTask" class="org.lzstone.action.LzstoneQuartzTask"/>
<!--註冊定時器資訊-->
<bean id="taskInfo" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!--指定要執行的定時任務類 這裡是LzstoneQuartzTask-->
<property name="targetObject">
<ref local="lzstoneQuartzTask"/>
</property>
<!--指定定時器任務類要執行的方法名稱 這裡是execute-->
<property name="targetMethod">
<value>execute</value>
</property>
</bean>
<!--配置定時器任務的調度器-->
<bean id="quartzTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<!--聲明要啟動並執行實體-->
<property name="jobDetail">
<ref local="taskInfo"/>
</property>
<!--設定已耗用時間-->
<property name="cronExpression">
<value>0 0 12 * * ?</value>
</property>
</bean>
<!--註冊監聽器-->
<bean id="registerQuartz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!--註冊定時器實體 集合-->
<property name="triggers">
<list>
<ref local="quartzTrigger"/>
</list>
</property>
</bean>
</beans>
2.3 web項目中的啟動設定
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/QuartzConfig.xml</param-value>
</context-param>

<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>


有兩種流行Spring定時器配置:Java的Timer類和OpenSymphony的Quartz。
  1.Java Timer定時
  首先繼承java.util.TimerTask類實現run方法

import java.util.TimerTask;
public class EmailReportTask extends TimerTask{
@Override
public void run() {
...
}
}
  在Spring定義
  ...
  配置Spring定時器

<bean id="scheduleReportTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="timerTask" ref="reportTimerTask" />
<property name="period">
<value>86400000value>
property>
bean>
  timerTask屬性告訴ScheduledTimerTask運行哪個。86400000代表24個小時
  啟動Spring定時器
  Spring的TimerFactoryBean負責啟動定時任務

<bean class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list><ref bean="scheduleReportTask"/>list>
property>
bean>
scheduledTimerTasks裡顯示一個需要啟動的定時器任務的列表。
可以通過設定delay屬性延遲啟動
<bean id="scheduleReportTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="timerTask" ref="reportTimerTask" />
<property name="period">
<value>86400000value>
property>
<property name="delay">
<value>3600000value>
property>
bean>
  這個任務我們只能規定每隔24小時運行一次,無法精確到某時啟動
  2.Quartz定時器
  首先繼承QuartzJobBean類實現executeInternal方法

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

public class EmailReportJob extends QuartzJobBean{
protected void executeInternal(JobExecutionContext arg0)
throws JobExecutionException {
...
}
}
  在Spring中定義

<bean id="reportJob" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<value>EmailReportJobvalue>
property>
<property name="jobDataAsMap">
<map>
<entry key="courseService">
<ref bean="courseService"/>
entry>
map>
property>
bean>
  在這裡我們並沒有直接聲明一個EmailReportJob Bean,而是聲明了一個JobDetailBean。這個是Quartz的特點。JobDetailBean是Quartz的org.quartz.JobDetail的子類,它要求通過jobClass屬性來設定一個Job對象。
  使用Quartz的JobDetail中的另一個特別之處是EmailReportJob的courseService屬性是間接設定的。JobDetail的jobDataAsMap屬性接受一個Map,包括設定給jobClass的各種屬性,當。JobDetailBean執行個體化時,它會將courseService Bean注入到EmailReportJob 的courseService 屬性中。
  啟動定時器
  Quartz的org.quartz.Trigger類描述了何時及以怎樣的頻度運行一個Quartz工作。Spring提供了兩個觸發器SimpleTriggerBean和CronTriggerBean。
  SimpleTriggerBean與scheduledTimerTasks類似。指定工作的執行頻度,模仿scheduledTimerTasks配置 .

<bean id="simpleReportTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="reprotJob" />
<property name="startDelay">
<value>360000value>
property>
<property name="repeatInterval">
<value>86400000value>
property>
bean>
  startDelay也是延遲1個小時啟動
  CronTriggerBean指定工作的準確已耗用時間

<bean id="cronReportTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="reprotJob" />
<property name="cronExpression">
<value>0 0 6 * * ?value>
property>
bean>
  屬性cronExpression告訴何時觸發。最神秘就是cron運算式:
  Linux系統的計劃任務通常有cron來承擔。一個cron運算式有至少6個(也可能7個)有空格分隔的時間元素。從左至右:
  1.秒2.分3.小時4.月份中的日期(1-31)5.月份(1-12或JAN-DEC)6.星期中的日期(1-7或SUN-SAT)7.年份(1970-2099)
  每個元素都顯示的規定一個值(如6),一個區間(9-12),一個列表(9,11,13)或一個萬用字元(*)。因為4和6這兩個元素是互斥的,因此應該通過設定一個問號(?)來表明不想設定的那個欄位,“/”如果值組合就表示重複次數(10/6表示每10秒重複6次)。
  啟動定時器

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list><ref bean="cronReportTrigger"/>list>
property>
bean>
  triggers屬性接受一組觸發器。

"0 0 12 * * ?" 每天中午12點觸發
"0 15 10 ? * *" 每天上午10:15觸發
"0 15 10 * * ?" 每天上午10:15觸發
"0 15 10 * * ? *" 每天上午10:15觸發
"0 15 10 * * ? 2005" 2005年的每天上午10:15觸發
"0 * 14 * * ?" 在每天下午2點到下午2:59期間的每1分鐘觸發
"0 0/5 14 * * ?" 在每天下午2點到下午2:55期間的每5分鐘觸發
"0 0/5 14,18 * * ?" 在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發
"0 0-5 14 * * ?" 在每天下午2點到下午2:05期間的每1分鐘觸發
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44觸發
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15觸發
"0 15 10 15 * ?" 每月15日上午10:15觸發
"0 15 10 L * ?" 每月最後一日的上午10:15觸發
"0 15 10 ? * 6L" 每月的最後一個星期五上午10:15觸發
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最後一個星期五上午10:15觸發
"0 15 10 ? * 6#3" 每月的第三個星期五上午10:15觸發

java中JOB介紹與Spring中JOB的配置

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.