l

2009年7月2日 星期四

在不同的Quartz Jobs之中共享資料

Quartz 是一個開放原始碼的排程(scheduling)軟體。要讓Quartz在我們設定好的時間執行特定的工作,首先實作Job 這個介面(interface)。Job介面只有一個方法:

void execute(JobExecutionContext context)

把要作的事情寫在 execute 裡面便可,當設定的時間一到Quartz自然會呼叫你的程式。Quartz的Job是沒有狀態的(stateless),如果你設定你的工作每一分鐘要被執行一次,那麼Quartz每次都會為你的工作產生一份新的instance,執行完畢之後就砍掉。如果希望這個工作每次執行能夠記住上次的狀態,便要實作StatefulJob介面。StatefulJob和Job內容完全相同,都只有一個void execute(JobExecutionContext context) 方法,差別在於Quartz會記住StatefulJob的狀態,也就是說Quartz只會幫實作StatefulJob的物件產生一份instance。例如,你有一個每一分鐘要被執行一次的StatefulJob,Quartz只有在第一次執行這個工作的時候會幫它產生一份instance,執行完畢之後會把該instance留下來等著下次繼續用。

關於stateless與stateful 的優缺點比較到處都有,大家孤狗一下便可。Teddy要說的是,如果兩個不同的Job要互相分享資料,要怎麼辦?看了一下Quartz Job Scheduling Framework: Building Open Source Enterprise Applications這本書,作者很好心的把這個問題留給我們自己思考。經過一翻有計畫的亂試之後,答案著實也很簡單:Quartz 的Scheduler介面,有一個getContext方法,會傳回一個SchedulerContext物件(類似Java的Map),把東西往裡面塞就可以了,所有屬於同一個Scheduler的工作可以看到SchedulerContext裡面的資料。

scheduler. getContext().put(“key”, “value”)

沒有留言:

張貼留言