ATG中的定时Job处理
一、ATG中定時(shí)Job核心處理Module
在ATG中核心的定時(shí)Job管理是放在Schedule這個(gè)Module下的,所以如果想要在你的應(yīng)用擁有定時(shí)執(zhí)行Job的能力,必須要在打包腳本中包含ScheduleModule。但是在生產(chǎn)環(huán)境中更為常見(jiàn)的做法是將ScheduleModule單獨(dú)打包成為一個(gè)應(yīng)用放在單獨(dú)的Server實(shí)例上,其他的應(yīng)用對(duì)其訪(fǎng)問(wèn)來(lái)觸發(fā)相應(yīng)的定時(shí)Job。這樣做的好處是方便管理,也可以在一定程度上避免共享資源沖突。
二、ATG定時(shí)Job的幾個(gè)概念:
1、Scheduler組件:shcedule模塊的核心服務(wù)是/atg/dynamo/service/Scheduler組件,該組件負(fù)責(zé)所有Job的跟蹤和觸發(fā)。該組件的addScheduledJob方法接收一個(gè)ScheduledJob結(jié)構(gòu),來(lái)實(shí)現(xiàn)對(duì)定時(shí)Job的注冊(cè)。
2、ScheduledJob結(jié)構(gòu):包含了Scheduler所需要所有參數(shù)選線(xiàn)的結(jié)構(gòu)類(lèi)。可參見(jiàn)下文代碼。
3、Job組件:需要開(kāi)發(fā)者自定義的組件,一個(gè)實(shí)現(xiàn)了atg.service.scheduler.Schedulable接口的組件。所有要做的工作都可以放在performScheduledTask實(shí)現(xiàn)。
調(diào)用/atg/dynamo/service/Scheduler組件的addScheduledJob方法 ,即可將一個(gè)Job組件加入到Scheduler中去實(shí)現(xiàn)定時(shí)觸發(fā)
以下這段代碼示例:一個(gè)Job組件包裝為ScheduledJob結(jié)構(gòu)傳給Scheduler。
ScheduledJob job = new ScheduledJob ("hello","Prints Hello",getAbsoluteName (),getSchedule (),ScheduleComponet,ScheduledJob.SCHEDULER_THREAD); jobId = getScheduler ().addScheduledJob (job);注:這一段通常寫(xiě)在Job組件的doStartService方法中(需繼承atg.nucleus.GenericService類(lèi)),用于啟動(dòng)組件時(shí)即可定時(shí)觸發(fā)。
4、Task:Job在執(zhí)行過(guò)程中產(chǎn)生的實(shí)例,每次觸發(fā)都會(huì)產(chǎn)生一個(gè)Task。
Task根據(jù)運(yùn)行線(xiàn)程的位置不同有幾種運(yùn)行模式
(a)SCHEDULER_THREAD:在Scheduler的主線(xiàn)程上直接執(zhí)行。在執(zhí)行的過(guò)程中其他的定時(shí)任務(wù)無(wú)法執(zhí)行。因此只適用于耗時(shí)較短的Task.
(b)SEPARATE_THREAD:另起一個(gè)單獨(dú)的線(xiàn)程,線(xiàn)程結(jié)束后立即銷(xiāo)毀。比較適用于那些定時(shí)間隔小于完成時(shí)間耗時(shí)的任務(wù)。例如完成一個(gè)任務(wù)大約需要5分鐘。定時(shí)間隔設(shè)置為3分鐘啟動(dòng)一次。
(c)REUSED_THREAD:另起一個(gè)單獨(dú)的線(xiàn)程,任務(wù)結(jié)束后,任務(wù)掛起等待下一次調(diào)用。如果任務(wù)還在執(zhí)行過(guò)程中,下一次調(diào)用又被觸發(fā)。此時(shí)不會(huì)新建單獨(dú)線(xiàn)程。
運(yùn)行模式是在將job加入Scheduler時(shí)傳入的,上文代碼中ScheduledJob.SCHEDULER_THREAD即是此選項(xiàng)。
5、Schedule :對(duì)于定時(shí)任務(wù)執(zhí)行時(shí)間的描述,即上文代碼中的getSchedule ()返回的字符串。ATG中有兩種定時(shí)方式
(a)按時(shí)間間隔:示例如下
schedule=in 30 seconds//在30秒之內(nèi)執(zhí)行一次 schedule=every 20 minutes//每20分鐘執(zhí)行一次 (b)按照固定時(shí)間:ATG使用以空格分隔的字符串(共計(jì)6個(gè)描述單位)來(lái)表示月、日期、周、每月的第幾周、小時(shí)、分鐘。ATG官方文檔對(duì)此描述的比較細(xì)致,不贅述。只舉例如下schedule=calendar 5 . 2 * * 0//Every Monday in June, every hour on the hour schedule=calendar * * * * 9-17 30//Every day, between 9am-5pm on the half hour三、實(shí)踐篇
1、寫(xiě)一個(gè)HelloJob.java類(lèi)
import atg.nucleus.*; import atg.service.scheduler.*;public class HelloJob extends GenericService implements Schedulable {public HelloJob () {}// Scheduler propertyScheduler scheduler;public Scheduler getScheduler () { return scheduler; }public void setScheduler (Scheduler scheduler){ this.scheduler = scheduler; }// Schedule propertySchedule schedule;public Schedule getSchedule () { return schedule; }public void setSchedule (Schedule schedule){ this.schedule = schedule; }// Schedulable methodpublic void performScheduledTask (Scheduler scheduler,ScheduledJob job){ System.out.println ("Hello"); }// Start methodint jobId;public void doStartService () throws ServiceException{ScheduledJob job = new ScheduledJob ("hello","Prints Hello",getAbsoluteName (),getSchedule (),this,ScheduledJob.SCHEDULER_THREAD);jobId = getScheduler ().addScheduledJob (job);}// Stop methodpublic void doStopService () throws ServiceException{getScheduler ().removeScheduledJob (jobId);} }2、定義helloJob的配置文件,形成組件
$class=HelloJob $scope=global scheduler=/atg/dynamo/service/Scheduler schedule=every 1 minutes3、定義該Job的啟動(dòng)時(shí)機(jī)
如果選擇隨Server啟動(dòng)即啟動(dòng),則需要找到你應(yīng)用的Initial.properties(如果沒(méi)有在你的$ATG_INSTALL_DIR/home/localconfig可以創(chuàng)建一個(gè)),文件內(nèi)容如下:
initialServices+=/test/HelloJob注:如果采用按鈕調(diào)用或者其他條件下啟動(dòng),則需要根據(jù)自己的需求來(lái)使用代碼控制何時(shí)觸發(fā)該Job的注冊(cè)。
4、打包、啟動(dòng)你的應(yīng)用
5、訪(fǎng)問(wèn)dyn/admin應(yīng)用,搜索/atg/dynamo/service/Scheduler即可看到所有Job,其中包含HelloJob
?
四、關(guān)于遠(yuǎn)程調(diào)用及SingletonSchedulableService
1、服務(wù)器間通信
ATG的應(yīng)用是多個(gè)Module打包成為一個(gè)應(yīng)用,一個(gè)應(yīng)用獨(dú)占為一個(gè)Server實(shí)例。原則上,ATG系統(tǒng)中每個(gè)應(yīng)用都可以存在定時(shí)Job處理。但是通常情況下,生產(chǎn)環(huán)境只會(huì)存在一個(gè)Schedule服務(wù)實(shí)例,所有的定時(shí)任務(wù)都在這個(gè)實(shí)例上運(yùn)行,因此很多情況下需要考慮服務(wù)間通信的問(wèn)題。舉例來(lái)說(shuō)如果Store應(yīng)用在用戶(hù)下單后需要觸發(fā)一個(gè)定時(shí)Job來(lái)完成某項(xiàng)工作,此時(shí)Store服務(wù)需要將此項(xiàng)Job注冊(cè)到Schedule服務(wù)上,需要使用遠(yuǎn)程調(diào)用的方式實(shí)現(xiàn),所以開(kāi)發(fā)者在開(kāi)發(fā)時(shí)需要明晰各種情況下的調(diào)用方式。當(dāng)然遠(yuǎn)程調(diào)用是另外一個(gè)話(huà)題,之后再寫(xiě)文探討。
2、SingletonSchedulableService
繼承SingletonSchedulableService 類(lèi)可以使用ATG提供的定時(shí)Job處理單例模式。此單例不是指當(dāng)前應(yīng)用下的單例,而是指ATG應(yīng)用集群下單例模式。這樣可以有效的避免多個(gè)應(yīng)用都存在相同的定時(shí)job,導(dǎo)致資源沖突。具體細(xì)節(jié)可參考ATG官方文檔。
3、其他
關(guān)于定時(shí)處理的官方文檔可參照:http://docs.oracle.com/cd/E23095_01/Platform.93/ATGProgGuide/html/s0905schedulerservices01.html
轉(zhuǎn)載于:https://www.cnblogs.com/shecinfo/archive/2013/05/04/3059838.html
總結(jié)
以上是生活随笔為你收集整理的ATG中的定时Job处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 内容组织高效项目方案是如何产生的 !
- 下一篇: SoftReference的用法