3 自動啟動Servlets
我們希望在應用被部署或容器啟動時就提交任務。我們必須在web模塊並重啟動的時候 初始化QuartzInitializerServlet 和 howto.quartz.servlet.QuartzServlet。為了達到 這個目的,我們需要在Web應用的部署描述符(web.xml)中增加以下內容:
<servlet>
<servlet-name>QuartzInitializer</servlet-name>
<display-name>Quartz Initializer Servlet</display-name>
<servlet- class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet- class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>QuartzServlet</servlet-name>
<display-name>Quartz Servlet</display-name>
<servlet-class>howto.quartz.servlet.QuartzServlet</servlet- class>
<init-param><param-name>cronExpr</param-name> <param- value>0 0/30 * * * ?</param-value></init-param>
<load-on-startup>2</load-on-startup>
</servlet>
Servlet 需要訪問能TestEJB,因此我們需要在web.xml中創建ejb-ref ,如下所示:
<ejb-ref>
<ejb-ref-name>ejb/TestEJB</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>howto.quartz.ejb.TestEJBHome</home>
<remote>howto.quartz.ejb.TestEJB</remote>
</ejb-ref>
4 組裝/打包應用
Web模塊需要訪問Quartz API,因此我們必須將Quartz 類庫打包到WAR模塊中。我們需 要將quartz.jar, commons-logging.jar, commons-pool-1.1.jar等放在WAR模塊的WEB- INF/lib目錄下。你的環境中需要的quartz 配置必須在quartz.properties文件中聲明, 該文件必須放在WAR模塊的WEB-INF/classes 目錄下。
包括了TestEJB的ejb-jar和包括了Quartz類庫和QuartzServlet的WAR需要打包為EAR並 部署到J2EE容器中,在我們的例子中使用的是OC4J。
5 配置你的服務器打開用戶線程功能
配置你的J2EE容器來打開用戶線程功能,你的應用作為Quartz計劃調度器創建的線程 被看作是用戶線程。以OC4J為例,你需要像下面這樣啟動OC4J來允許用戶線程:
java -jar oc4j.jar -userThreads
6 發布你的J2EE應用
然後在你的J2EE容器中發布你的應用。確信你的應用已經設置為隨著應用服務器一起 自動啟動。以OC4J為例,你必須確信設置了應用的web模塊的auto-start屬性和load-on- startup屬性為true。確信你在服務器配置文件中有以下內容:
server.xml:
<application name="quartz" path="../applications/quartz- app.ear" auto-start="true" />
http-web-site.xml:
<web-app application="quartz" name="quartz-web" load- on-startup="true" root="/quartz" />
7 現在你可以開始了
你的 EJB 方法現在已經被配置為每30分鐘執行一次的計劃任務了。
8 參考材料
Quartz 文檔: http://www.quartzscheduler.org/quartz
Dejan Bosanac 撰寫的Job Scheduling in Java