Listeners是您創(chuàng)建的對(duì)象,用于根據(jù)調(diào)度程序中發(fā)生的事件執(zhí)行操作。您可能猜到,TriggerListeners接收到與觸發(fā)器(trigger)相關(guān)的事件,JobListeners 接收與jobs相關(guān)的事件。
與觸發(fā)相關(guān)的事件包括:觸發(fā)器觸發(fā),觸發(fā)失靈(在本文檔的“觸發(fā)器”部分中討論),并觸發(fā)完成(觸發(fā)器關(guān)閉的作業(yè)完成)。
org.quartz.TriggerListener接口
public interface TriggerListener {
public String getName();
public void triggerFired(Trigger trigger, JobExecutionContext context);
public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context);
public void triggerMisfired(Trigger trigger);
public void triggerComplete(Trigger trigger, JobExecutionContext context,
int triggerInstructionCode);
}
job相關(guān)事件包括:job即將執(zhí)行的通知,以及job完成執(zhí)行時(shí)的通知。
org.quartz.JobListener接口
public interface JobListener {
public String getName();
public void jobToBeExecuted(JobExecutionContext context);
public void jobExecutionVetoed(JobExecutionContext context);
public void jobWasExecuted(JobExecutionContext context,
JobExecutionException jobException);
}
要?jiǎng)?chuàng)建一個(gè)listener,只需創(chuàng)建一個(gè)實(shí)現(xiàn)org.quartz.TriggerListener和/或org.quartz.JobListener接口的對(duì)象。然后,listener在運(yùn)行時(shí)會(huì)向調(diào)度程序注冊(cè),并且必須給出一個(gè)名稱(chēng)(或者,他們必須通過(guò)他們的getName()方法來(lái)宣傳自己的名字)。
為了方便起見(jiàn),實(shí)現(xiàn)這些接口,您的類(lèi)也可以擴(kuò)展JobListenerSupport類(lèi)或TriggerListenerSupport類(lèi),并且只需覆蓋您感興趣的事件。
listener與調(diào)度程序的ListenerManager一起注冊(cè),并配有描述listener希望接收事件的job/觸發(fā)器的Matcher。
Listener在運(yùn)行時(shí)間內(nèi)與調(diào)度程序一起注冊(cè),并且不與jobs和觸發(fā)器一起存儲(chǔ)在JobStore中。這是因?yàn)槁?tīng)眾通常是與應(yīng)用程序的集成點(diǎn)。因此,每次運(yùn)行應(yīng)用程序時(shí),都需要重新注冊(cè)該調(diào)度程序。
添加對(duì)特定job感興趣的JobListener:
scheduler.getListenerManager().addJobListener(myJobListener,KeyMatcher.jobKeyEquals(new JobKey("myJobName","myJobGroup")));
您可能需要為匹配器和關(guān)鍵類(lèi)使用靜態(tài)導(dǎo)入,這將使您定義匹配器更簡(jiǎn)潔:
import static org.quartz.JobKey.*;
import static org.quartz.impl.matchers.KeyMatcher.*;
import static org.quartz.impl.matchers.GroupMatcher.*;
import static org.quartz.impl.matchers.AndMatcher.*;
import static org.quartz.impl.matchers.OrMatcher.*;
import static org.quartz.impl.matchers.EverythingMatcher.*;
...etc.
這將上面的例子變成這樣:
scheduler.getListenerManager().addJobListener(myJobListener, jobKeyEquals(jobKey("myJobName", "myJobGroup")));
添加對(duì)特定組的所有job感興趣的JobListener:
scheduler.getListenerManager().addJobListener(myJobListener, jobGroupEquals("myJobGroup"));
添加對(duì)兩個(gè)特定組的所有job感興趣的JobListener:
scheduler.getListenerManager().addJobListener(myJobListener, or(jobGroupEquals("myJobGroup"), jobGroupEquals("yourGroup")));
添加對(duì)所有job感興趣的JobListener:
scheduler.getListenerManager().addJobListener(myJobListener, allJobs());
注冊(cè)TriggerListeners的工作原理相同。
Quartz的大多數(shù)用戶并不使用Listeners,但是當(dāng)應(yīng)用程序需求創(chuàng)建需要事件通知時(shí)不需要Job本身就必須明確地通知應(yīng)用程序,這些用戶就很方便。
更多建議: