quartz的架構(gòu)是模塊化的,因此要運行幾個組件需要“快速”在一起。幸運的是,有一些幫手出現(xiàn)這種情況。
在Quartz可以完成其工作之前需要配置的主要組件有:
該線程池提供了一組Quartz在執(zhí)行jobs時使用的線程。池中的線程越多,并發(fā)運行的jobs數(shù)越多。但是,太多的線程可能會破壞您的系統(tǒng)。大多數(shù)Quartz用戶發(fā)現(xiàn),5個左右的線程是充足的 - 因為在任何給定時間,它們的jobs數(shù)量少于100個,通常不會同時運行這些jobs,而且這些jobs是短暫的(快速完成)。其他用戶發(fā)現(xiàn)他們需要10個,15個,50個甚至100個線程,因為它們具有數(shù)萬個具有各種計劃的triggers,最終平均在任何給定時刻執(zhí)行10到100個jobs。為調(diào)度程序的池找到正確的大小完全取決于您正在使用的調(diào)度程序。沒有真正的規(guī)則,除了保持線程數(shù)量盡可能小(為了您的機器的資源) - 但確保您已足夠讓您的Jobs按時啟動。請注意,如果triggers的觸發(fā)時間到達,并且沒有可用的線程,Quartz將阻止(暫停)直到線程可用,然后jobs將執(zhí)行 - 比它應(yīng)有的數(shù)毫秒。這甚至可能導(dǎo)致線程失火 - 如果在調(diào)度程序配置的“失火閾值”的持續(xù)時間內(nèi)沒有可用的線程。那么jobs將執(zhí)行 - 比它應(yīng)該有幾毫秒。
ThreadPool接口在org.quartz.spi包中定義,您可以以任何您喜歡的方式創(chuàng)建ThreadPool實現(xiàn)。Quartz帶有一個名為org.quartz.simpl.SimpleThreadPool的簡單(但非常令人滿意)的線程池。這個ThreadPool只是在它的池中維護一個固定的線程集 - 永遠不會增長,永遠不會縮小。但是否則它是非常強大的,并經(jīng)過很好的測試 - 因為幾乎所有使用Quartz的人都使用這個池。
JobStores和 DataSource在本教程的第9課中討論過。值得注意的是,所有JobStores都實現(xiàn)了org.quartz.spi.JobStore接口 - 如果一個捆綁的JobStores不符合您的需求,那么您可以自己創(chuàng)建。
最后,您需要創(chuàng)建您的Scheduler實例。調(diào)度程序本身需要被賦予一個名字,告訴其RMI設(shè)置,并遞交JobStore和ThreadPool的實例。RMI設(shè)置包括調(diào)度程序是否應(yīng)將自身創(chuàng)建為RMI的服務(wù)器對象(使其可用于遠程連接),要使用的主機和端口等。StdSchedulerFactory(下面將討論)還可以生成實際代理的Scheduler實例( RMI存根)到在遠程進程中創(chuàng)建的計劃程序。
StdSchedulerFactory是org.quartz.SchedulerFactory接口的一個實現(xiàn)。它使用一組屬性(java.util.Properties)來創(chuàng)建和初始化Quartz Scheduler。屬性通常存儲在文件中并從文件中加載,但也可以由程序創(chuàng)建并直接傳遞到工廠。簡單地調(diào)用工廠中的getScheduler()將生成調(diào)度程序,并初始化它(和它的ThreadPool,JobStore和DataSources)并返回一個句柄到它的公共接口。
在Quartz發(fā)行版的“docs / config”目錄中有一些示例配置(包括屬性的描述)。您可以在Quartz文檔的“參考”部分的“配置”手冊中找到完整的文檔。
DirectSchedulerFactory是另一個SchedulerFactory實現(xiàn)。對于希望以更加程序化的方式創(chuàng)建其Scheduler實例的用戶是有用的。通常不鼓勵使用它的用法,原因如下:(1)要求用戶更好地了解他們正在做什么,(2)它不允許聲明性配置 - 換句話說,你最終會硬 - 編輯所有調(diào)度程序的設(shè)置。
Quartz使用SLF4J框架來滿足所有的日志記錄需求。為了“調(diào)整”日志記錄設(shè)置(例如輸出量以及輸出位置),您需要了解SLF4J框架,這超出了本文檔的范圍。
如果要捕獲關(guān)于triggers啟動和jobs執(zhí)行的額外信息,可能有興趣啟用org.quartz.plugins.history.LoggingJobHistoryPlugin和/或 org.quartz.plugins.history.LoggingTriggerHistoryPlugin。
更多建議: