程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> Java Web應用中任務調度解析(1)

Java Web應用中任務調度解析(1)

編輯:JAVA編程入門知識

任務調度是大型J2EE web應用中常見的工作。開發者希望以指定的間隔時間執行各類操作,並完成一些無需用戶輸入的任務。

Java中可有無數方法來做到這一點,但是在web應用中卻並沒有這方面的統一標准。當許多開發人員參與同一個項目,並且以各自不同的方式來實現任務調度時,就可能產生很大問題。內存和同步問題就是必須首先考慮的兩件事。事實上,一些開發者試圖調用操作系統層面的任務調度機制,如Unix平台上的cron。這種編程實踐也許並不是太壞,但它將直接導致可移植性被拋到九霄雲外。

為何需要任務調度?

在web應用中,大多數任務是以一種"防止用戶長時間等待"的方式完成的。在Google搜索這樣的例子中,減少等待時間對用戶體驗來說至關重要。異步任務的一種解決方案是在用戶提交後生成一個線程(來處理異步任務),但這也不能解決那些需要以一定時間間隔重復運行任務、或在天天的指定時間運行任務的情況。

讓我們從一個數據庫報表的例子來看看任務調度能如何幫助改善系統設計。報表可能是錯綜復雜的,這取決於用戶所需數據的種類,以及是否需要從一個或多個數據庫收集大量數據。用戶可能需要很長時間來運行這樣的"按需"報表。因此,我們向這個報表示例中添加任務調度機制,以便用戶可以安排在任何他們需要的時間生成報表,並以PDF或其他格式在email中發送。用戶可以讓報表在天天的凌晨2:22,系統正處於低負荷時運行;也可以選擇只在特定時間運行一次。通過在報表應用中加入任務調度,我們可以為產品添加一項有用的功能,並改善用戶體驗。

幸運的是,有一個強大的開源解決方案可以讓我們以標准的方式在web應用(或任何Java應用)中實施任務調度。以下示例展示了在web應用中,如何使用Quartz來創建一個任務調度框架。這個示例還使用了Struts Action framework 插件,以便在web應用啟動時初始化任務調度機制。Struts是最常見的MVC框架,為大多數開發人員所熟悉。當然除此之外還有許多框架可以協助在web應用中實現MVC模式。

啟動時初始化任務調度器

我們首先要做的是建立一個Struts插件,讓它在容器啟動時創建我們的任務調度器。在以下例子中,我們選擇Tomcat作為web應用容器,不過這些示例在其他容器中也應當可以運行。我們要創建一個Struts插件類,並在struts-config.XML中加入幾行代碼以使之可以工作。

這個插件有兩個可配置的初始化參數:startOnLoad指定是否要在容器啟動時立即啟動任務調度器,而 startupDelay指定啟動任務調度器之前的等待時間。啟動延時很有用,因為我們可能需要首先執行一些更重要的初始化步驟。此外還可以使用listener機制,以更復雜的方式來通知SchedulerPlugIn何時啟動Quartz Scheduler。

<plug-in className="SchedulerPlugIn">
  
  <set-property property="startOnLoad" value="false" />
  
  <set-property property="startupDelay" value="0" />
  
  </plug-in>

我們要創建的是一個實現Struts插件接口org.apache.struts.action.PlugIn的單子類SchedulerPlugIn。Struts會按照配置文件中出現的順序初始化各個插件。要非凡注重的是init()方法中的代碼,在此我們初始化了所需的Quartz對象,並得到Scheduler。我們的任務信息就要提交到此org.quartz.Scheduler對象,後者將在隨後討論。Scheduler對象由Quartz servlet根據其配置初始化,就像Struts初始化它的ActionServlet類一樣。讓我們來看init()方法:

public void init(ActionServlet actionServlet,
  
  ModuleConfig moduleConfig) {

System.out.println("Initializing Scheduler PlugIn for Jobs!");
  
  // Retrieve the ServletContext
  
  // 獲取ServletContext
  
  ServletContext ctx = actionServlet.getServletContext();
  
  // The Quartz Scheduler
  
  // Quartz Scheduler對象
  
  Scheduler scheduler = null;

// Retrieve the factory from the ServletContext.
  
  // It will be put there by the Quartz Servlet
  
  // 從ServletContext取得由Quartz Servlet放置在此的factory對象。
  
  StdSchedulerFactory factory = (StdSchedulerFactory)
  
  ctx.getAttribute(QuartzInitializerServlet.QUARTZ_FACTORY_KEY);
  
  try{
  
  // Retrieve the scheduler from the factory
  
  // 從factory取得scheduler
  
  scheduler = factory.getScheduler();


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved