bboss quartz元件全攻略
本文全面介紹bboss中quartz元件的配置和使用方法。
定時任務預設配置檔案一般在resources下面:
/resources/org/frameworkset/task/quarts-task.xml
摘要
1.resources下的quartz.properties檔案為quartz引擎的預設配置,同時也可在bboss quartz引擎xml家配置檔案中配置quartz引擎的配置參數覆寫預設配置(這裡不做介紹)
2.quartz監聽器配置
全局schedule監聽器,全局job監聽器,job監聽器,全局trigger監聽器,trigger監聽器
3.月曆配置
4.觸發器配置
cron,simple,DateInterval,NthIncludedDay四種基本觸發器類型
還有一種bboss提供特定類型builder類型,通過這種類型使用者可以自己實作TriggerBuilder接口來動态建立自己的
Trigger類型,如果任務配置參數有變化還可以重新加載這些參數并重新開機對應的作業。
5.quartz 任務配置
6.任務的啟用和停用
下面詳細介紹2,3,4,5,6部分。
一、執行個體
使用者可以看一個配置執行個體:
task-quartz-exception.xml 加載改配置并啟動一個quartz引擎:TaskService taskService = TaskService.getTaskService("org/frameworkset/task/task-quartz-exception.xml");
taskService.startService();
我們結合執行個體來說明上述的幾個部分。
二、quartz監聽器配置
1.全局schedule監聽器
schedule監聽器監聽quartz引擎中任務生命周期管理事件,包括任務加載、建立、銷毀、挂起、執行等事件的監聽,引擎全局配置,可以配置多個schedule監聽器。配置執行個體如下:
<property name="quartz.config.schedulerlistener">
<list componentType="bean">
<property name="DefaultSchedulerlistener" class="org.frameworkset.task.DefaultSchedulerListener"/>
</list>
</property>
可以在list元素中配置多個scheduler監聽器,配置順序就是他們的執行順序。DefaultSchedulerListener是bboss預設提供的scheduler監聽器,配置該監聽器可以将相關的事件資訊用log4j輸出到日志檔案中,日志級别為info級。
使用者可以定義自己的scheduler監聽器,必須實作org.quartz.SchedulerListener接口。
2.全局job監聽器
全局job監聽器可以監聽所有quartz job事件,配置執行個體:
<property name="quartz.config.globaljoblistener">
<list componentType="bean">
<property name="DefaultGlobalJobListener" class="org.frameworkset.task.DefaultGlobalJobListener"/>
</list>
</property>
可以在list元素中配置多個GlobalJobListener監聽器,配置順序就是他們的執行順序。DefaultGlobalJobListener是bboss預設提供的GlobalJobListener,配置該監聽器可以将相關的事件資訊用log4j輸出到日志檔案中,日志級别為info級。
使用者可以定義自己的GlobalJobListener監聽器,必須實作org.frameworkset.task.BaseJobListener基礎抽象類。
3.job監聽器
job監聽器可以監聽指定quartz job任務的執行情況,配置執行個體:
<property name="quartz.config.joblistener">
<list componentType="bean">
<property name="DefaultJobListener" class="org.frameworkset.task.DefaultJobListener"/>
</list>
</property>
可以在list元素中配置多個JobListener監聽器,然後在特定的任務上面指定相應的監聽器的名稱即可(可以指定多個,用逗号分隔)。DefaultJobListener是bboss預設提供的JobListener,配置該監聽器可以将相關的事件資訊用log4j輸出到日志檔案中,日志級别為info級。
使用者可以定義自己的JobListener監聽器,必須實作org.frameworkset.task.BaseJobListener基礎抽象類。
在具體的任務上配置job listener的執行個體:
<property name="beanmethodjobnoargs" jobid="beanmethodjobnoargs"
bean-name="methodjob"
method="actionexception"
calendar="2012year"
joblistenername="DefaultJobListener"
triggerlistenername="DefaultTriggerListener"
trigger="cron"
cronb_time="2 * * * * ?" used="false"
shouldRecover="false"/>
joblistenername元素屬性指定了job監聽器的名稱
joblistenername="DefaultJobListener"
如果有多個listener,配置方法為:
joblistenername="DefaultJobListener,listener1,listener2"
4.全局trigger監聽器
全局trigger監聽器可以監聽所有quartz job任務被觸發的事件,配置執行個體:
<property name="quartz.config.globaltriggerlistener">
<list componentType="bean">
<property name="GlobleTriggerListener" class="org.frameworkset.task.GlobalTriggerListener"/>
</list>
</property>
可以在list元素中配置多個GlobleTriggerListener監聽器,配置順序就是他們的執行順序。org.frameworkset.task.GlobalTriggerListener是bboss預設提供的GlobleTriggerListener,配置該監聽器可以将相關的事件資訊用log4j輸出到日志檔案中,日志級别為info級。
使用者可以定義自己的GlobleTriggerListener監聽器,必須實作org.frameworkset.task.BaseTriggerListener基礎抽象類。
5.trigger監聽器
trigger監聽器可以監聽指定quartz 任務的執行情況,配置執行個體:
<property name="quartz.config.triggerlistener">
<list componentType="bean">
<property name="DefaultTriggerListener" class="org.frameworkset.task.DefaultTriggerListener"/>
</list>
</property>
可以在list元素中配置多個TriggerListener監聽器,然後在特定的任務上面指定相應的監聽器的名稱即可(可以指定多個,用逗号分隔)。org.frameworkset.task.DefaultTriggerListener是bboss預設提供的TriggerListener,配置該監聽器可以将相關的事件資訊用log4j輸出到日志檔案中,日志級别為info級。
使用者可以定義自己的TriggerListener監聽器,必須實作org.frameworkset.task.BaseTriggerListener基礎抽象類。
在具體的任務上配置trigger listener的執行個體:
<property name="beanmethodjobnoargs" jobid="beanmethodjobnoargs"
bean-name="methodjob"
method="actionexception"
calendar="2012year"
joblistenername="DefaultJobListener"
triggerlistenername="DefaultTriggerListener"
trigger="cron"
cronb_time="2 * * * * ?" used="false"
shouldRecover="false"/>
triggerlistenername元素屬性指定了trigger監聽器的名稱
triggerlistenername="DefaultTriggerListener"
triggerlistenername="DefaultTriggerListener,listener1,listener2"
三、月曆配置
quartz引擎可以定義各種月曆,比如節假日等等,然後可以在任務上指定一個月曆,這樣就可以結合月曆和時間周期規則來執行quartz任務了。
1.月曆的定義
我們可以定義以下類型的月曆:
AnnualCalendar
CronCalendar
DailyCalendar
HolidayCalendar
MonthlyCalendar
WeeklyCalendar
我們可以通過配置月曆建構類和配置月曆腳本(依賴bsh腳本引擎),下面包含兩個情況的執行個體:
<property name="quartz.config.calendar">
<map>
<property name="2012year">
<![CDATA[
//法定節日是以每年為周期的,是以使用AnnualCalendar
AnnualCalendar holidays = new AnnualCalendar();
//五一勞動節
java.util.Calendar laborDay = new GregorianCalendar();
laborDay.add(java.util.Calendar.MONTH,5);
laborDay.add(java.util.Calendar.DATE,1);
holidays.setDayExcluded(laborDay, true); //排除的日期,如果設定為false則為包含
//國慶節
java.util.Calendar nationalDay = new GregorianCalendar();
nationalDay.add(java.util.Calendar.MONTH,10);
nationalDay.add(java.util.Calendar.DATE,1);
holidays.setDayExcluded(nationalDay, true);//排除該日期
return holidays;
]]>
</property>
<property name="2013year" class="org.frameworkset.task.TestCalendarBuilder"/>
</map>
</property>
org.frameworkset.task.TestCalendarBuilder實作了抽象類org.frameworkset.task.BaseCalendarBuilder,代碼如下:
package org.frameworkset.task;
import java.util.GregorianCalendar;
import org.quartz.Calendar;
import org.quartz.impl.calendar.AnnualCalendar;
public class TestCalendarBuilder extends BaseCalendarBuilder {
public TestCalendarBuilder() {
// TODO Auto-generated constructor stub
}
public Calendar buildCalendar() {
//法定節日是以每年為周期的,是以使用AnnualCalendar
AnnualCalendar holidays = new AnnualCalendar();
//五一勞動節
java.util.Calendar laborDay = new GregorianCalendar();
laborDay.add(java.util.Calendar.MONTH,5);
laborDay.add(java.util.Calendar.DATE,1);
holidays.setDayExcluded(laborDay, true); //排除的日期,如果設定為false則為包含
//國慶節
java.util.Calendar nationalDay = new GregorianCalendar();
nationalDay.add(java.util.Calendar.MONTH,10);
nationalDay.add(java.util.Calendar.DATE,1);
holidays.setDayExcluded(nationalDay, true);//排除該日期
return holidays;
}
}
可以配置多個,每個月曆都必須有一個唯一的名稱,quartz任務通過名稱來引用月曆。
2.任務上指定月曆
執行個體如下:
<property name="beanmethodjobnoargs" jobid="beanmethodjobnoargs"
bean-name="methodjob"
method="actionexception"
calendar="2012year"
joblistenername="DefaultJobListener"
triggerlistenername="DefaultTriggerListener"
trigger="cron"
cronb_time="2 * * * * ?" used="false"
shouldRecover="false"/>
通過calendar屬性指定月曆:
calendar="2012year"
四、觸發器配置
quartz提供了四種基本觸發器類型trigger,對應于bboss中cron,simple,DateInterval,NthIncludedDay四種觸發器類型, 預設類型為cron,還有一種bboss提供特定類型builder類型,通過這種類型使用者可以自己實作TriggerBuilder接口來動态建立自己的Trigger類型,如果任務配置參數有變化還可以重新加載這些參數并重新開機對應的作業。
所有時間格式采用yyyy-MM-dd HH:mm:ss格式配置,每個trigger可以定義的屬性集說明如下。
1.cron 屬性集:
timeZone 時區辨別
volatility boolean 是否持久化任務
shouldRecover
description
durability boolean 任務失效後是否保留
cronb_time
2.simple 屬性集:
startTime 例如:startTime="2013-01-23 16:29:00"
endTime
repeatCount
repeatInterval The number of milliseconds to pause between the repeat firing.
3.DateInterval 屬性集
startTime
intervalUnit { SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, YEAR }
repeatInterval
4.NthIncludedDay 屬性集
fireAtTime HH:MM[:SS]
intervalType WEEKLY MONTHLY YEARLY
N 第幾
5.builder
builder類型是bboss提供的特殊類型,通過這種類型使用者可以自己實作TriggerBuilder接口來動态建立自己的
Trigger類型,如果任務配置參數有變化還可以重新加載這些參數并重新開機對應的作業。trigger由實作接口org.frameworkset.task.TriggerBuilder的元件方法建立:
public Trigger builder(SchedulejobInfo jobInfo) throws Exception;
通過方法參數SchedulejobInfo可以讀取到任務的各種靜态配置屬性,這些屬性可以是cron ,simple,DateInterval,NthIncludedDay四種類型中的屬性集,取決于方法傳回的Trigger類型(cron ,simple,DateInterval,NthIncludedDay),同時還可以從其他諸如資料庫表中讀取和加載任務作業屬性,如果這些屬性發生變化,還可以重新開機作業實時加載變化後的配置
屬性集
自動繼承cron ,simple,DateInterval,NthIncludedDay四種類型中的屬性集,特有的屬性如下:
triggerbuilder-bean 指定trigger生成器為一個bboss ioc 元件
triggerbuilder-class 指定trigger生成器的實作類class路徑
用法
當任務時間周期發生變化時,可以調用TaskService接口重新開機相應的任務:
更新預設組的作業
public void updateExecuteJob(String jobname);
更新指定作業組的任務
public void updateExecuteJob(String groupid, String jobname)
我們在任務上用trigger屬性來制定任務的trigger類型,執行個體如下:
<property name="simplebeanmethodjobnoargs" jobid="simplebeanmethodjobnoargs"
bean-name="methodjob"
method="actionexception"
calendar="2013year"
triggerlistenername="DefaultTriggerListener"
trigger="simple"
startTime="2013-01-23 16:29:00"
repeatCount="2"
repeatInterval="2000"
used="true"
shouldRecover="false"/>
執行個體中通過trigger屬性指定了任務的trigger類型為simple,然後指定了相應的其他時間屬性:startTime,repeatCount,repeatInterval
并且還會結合calendar來設定節假日不執行任務。其他三種類型類似,篇幅關系就不說明了。
重點說明一下Builder類型兩種使用方式:
triggerbuilder-class方式
<property name="simplebeanmethodjobnoargs-triggerbuilderclass" jobid="simplebeanmethodjobnoargs-triggerbuilderclass"
bean-name="methodjob"
method="actionexception"
calendar="2013year"
triggerlistenername="DefaultTriggerListener"
trigger="builder"
triggerbuilder-class="org.frameworkset.task.TestTiggerBuilder"
used="true"
shouldRecover="false"/>
triggerbuilder-bean方式
<property name="simplebeanmethodjobnoargs-triggerbuilderbean" jobid="simplebeanmethodjobnoargs-triggerbuilderbean"
bean-name="methodjob"
method="actionexception"
calendar="2013year"
triggerlistenername="DefaultTriggerListener"
trigger="builder"
triggerbuilder-bean="testTiggerBuilder"
used="true"
shouldRecover="false"/>
triggerbuilder-bean方式必須在quartz引擎的ioc容器中配置一個TiggerBuilder元件:
<property name="testTiggerBuilder" class="org.frameworkset.task.TestTiggerBuilder"/>
TestTiggerBuilder元件的實作代碼如下:
package org.frameworkset.task;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import com.frameworkset.util.StringUtil;
import com.frameworkset.util.ValueObjectUtil;
public class TestTiggerBuilder implements TriggerBuilder {
public Trigger builder(SchedulejobInfo jobInfo) throws Exception {
//builder方法中的各種參數都可以從資料庫中擷取
String s_startTime = jobInfo.getJobPro().getStringExtendAttribute("startTime");
Date startTime = null;
if(!StringUtil.isEmpty(s_startTime) )
{
SimpleDateFormat format = ValueObjectUtil.getDefaultDateFormat();
startTime = format.parse(s_startTime);
}
else
startTime = new Date();
String s_endTime = jobInfo.getJobPro().getStringExtendAttribute("endTime");
Date endTime = null;
if(!StringUtil.isEmpty(s_endTime) )
{
SimpleDateFormat format = ValueObjectUtil.getDefaultDateFormat();
endTime = format.parse(s_endTime);
}
String s_repeatCount = jobInfo.getJobPro().getStringExtendAttribute("repeatCount");
int repeatCount = 0;
if(!StringUtil.isEmpty(s_repeatCount) )
{
repeatCount = Integer.parseInt(s_repeatCount);
}
else
{
repeatCount = 3;
}
String s_repeatInterval = jobInfo.getJobPro().getStringExtendAttribute("repeatInterval");
long repeatInterval = 0;
if(!StringUtil.isEmpty(s_repeatInterval) )
{
repeatInterval = Long.parseLong(s_repeatInterval);
}
else
repeatInterval = 2000;
SimpleTrigger simpletrigger = new SimpleTrigger(jobInfo.getId(), jobInfo.getScheduleServiceInfo().getId(), startTime,
endTime, repeatCount, repeatInterval);
return simpletrigger;
}
}
builder方法中的各種參數都可以從資料庫中擷取,如果參數有調整則可以調用以下方法重新開機作業:
TaskService taskService = TaskService.getTaskService("org/frameworkset/task/test-quarts-task.xml")//通過加載自定義配置檔案生成的quartz引擎;
taskService.updateExecuteJob("simplebeanmethodjobnoargs-triggerbuilderbean");
或者
TaskService taskService = TaskService.getTaskService()//預設quartz引擎;
taskService.updateExecuteJob("simplebeanmethodjobnoargs-triggerbuilderbean");
五、任務配置
這裡簡單地介紹一下bboss quartz元件任務配置方式,主要有三種:
1.實作org.frameworkset.task.Execute接口的配置方式
例如:
Execute接口實作類
package org.frameworkset.task;
import java.io.Serializable;
import java.util.Map;
public class TestJob implements Execute, Serializable {
public void execute(Map parameters) {
System.out.println("send_count = "+parameters.get("send_count"));
}
}
任務配置:
<property name="workbroker" jobid="workbroker"
action="org.frameworkset.task.TestJob"
cronb_time="0 56 14 * * ?" used="true"
shouldRecover="false"
>
<map>
<property name="send_count" value="2" />
</map>
</property>
如果任務在執行的時候需要一些配置參數,可以通過map來指定,然後可以再任務執行的時候在execute方法的Map參數parameters中擷取;如果沒有參數則無需配置map子元素。
2.直接配置任務處理類名并指定執行方法的方式
class方式指定 任務程式,method方法對應要執行的方法,通過construction指定方法的參數值,多個參數按照參數的順序指定多個property屬性即可。
<property name="beanclassmethodjob" jobid="beanclassmethodjob"
bean-class="org.frameworkset.task.ClassMethodJob"
method="action"
cronb_time="2 * * * * ?" used="true"
shouldRecover="false">
<construction>
<property name="hello" value="hello" />
</construction>
</property>
如果方法沒有參數就無需配置construction元素,ClassMethodJob實作類代碼如下:
package org.frameworkset.task;
public class ClassMethodJob {
public void action(String hello)
{
System.out.println("ClassMethodJob:doing " + hello);
}
public void action()
{
System.out.println("ClassMethodJob:doing no params");
}
}
3.元件方式指定任務執行程式
通過bean-name指定任務程式元件,method指定要執行的方法,通過construction指定方法的參數值,多個參數按照參數的順序指定多個property屬性即可。
<property name="beanmethodjob" jobid="beanmethodjob"
bean-name="methodjob"
method="action"
cronb_time="2 * * * * ?" used="true"
shouldRecover="false">
<construction>
<property name="hello" value="hello" />
</construction>
</property>
bean-name="methodjob"指定元件的名稱,如果方法沒有參數就無需配置construction元素,對應的元件必須在quartz-task.xml檔案中配置:
<property name="methodjob" class="org.frameworkset.task.MethodJob"/>
元件的定義遵行bboss ioc的文法規範,可以在quartz-task.xml檔案中配置,也可以引用其他ioc容器中的元件,我們看一個引用mvc 容器中配置的元件的執行個體:
<!--首先通過工廠模式擷取mvc容器對像-->
<property name="webapplicationcontext" factory-class="org.frameworkset.web.servlet.support.WebApplicationContextUtils" factory-method="getWebApplicationContext"/>
<!--逾期服務類,該元件引用了mvc容器對象中一個元件-->
<property name="exceedServiceImpl" factory-bean="webapplicationcontext" factory-method="getBeanObject">
<construction>
<property value="exceed.service.ExceedServiceImpl" />
</construction>
</property>
六、任務的啟用和停用
bboss中管理的quartz任務可以通過配置非常友善地開啟和關閉:
1.全局關閉和開啟quartz引擎
首先找到quartz-task.xml或者你自己的配置檔案中的以下配置:
<property name="taskconfig" enable="false">
然後修改enable屬性值為true,表示開啟quartz引擎,false表示關閉quartz引擎。enable設定為false,則執行下述方法時将不會啟動quartz引擎:
TaskService.getTaskService().startService();
TaskService.getTaskService("quartz-custorm.xml").startService();
2.特定任務的開啟和關閉
如果不想運作某個quartz任務,那麼可以通過任務的used屬性進行控制:
used 為true時啟用任務,為false時關閉任務
以下是一個配置示例:
<property name="browserCounterStatisticDailyJob" jobid="browserCounterStatisticDailyJob"
bean-name="browserCounterStatisticDailyJob"
method="statisticBrowserCounterDailyJob"
cronb_time="0 0 0am * * ?" used="false"
shouldRecover="false"
>
</property>
至此bboss quartz元件的功能就全部介紹完畢。
參考文檔:
基于quartz任務排程元件的使用