第一章.  企業應用中的作業調度

·什么是作業調度
·作業調度為什么說是重要的
·企業應用中的作業調度
·非企業應用中的作業調度
·作業調度與工作流
·關于作業調度其他可選擇方案

1. 什么是作業調度
“作業”,這一技術述語上的概念,又讓我們回到了大型機的年代,那時候,用戶/程序員提交一疊穿孔卡片或者紙帶(上面描述了一個作業)給操作人員,由操作人員幫忙執行那些作業。用戶等待作業執行完后,回到主機那邊取自己的卡片和打印出來的輸出結果。

因為不是每一個作業要求立即被執行,所以作業可以被安排在將來的某個時候執行。比如說,一個系統管理員每天晚上可能有一份要執行的作業列表:
· 10:00 PM: 運行患者信息文件的上載作業
· 11:00 PM: 運行銷售數據報表生成
· 11:59 PM: 進行數據庫的備份

作業調度通常是指運行一個批量的作業或稱之謂批處理。這種批處理作業一般都是放在后臺運行并且不需要與用戶交互?,F在,顯著增多的多樣性的任務已代替了早先的批量作業。在一個大的組織中每天的每小時跑上百個作業已屬普遍。并且作業的規模與復雜性仍在持續的上揚,因此批量作業和作業調度器也就隨需應生。

2. 作業調度為什么說是重要的
俗話說,“時間就是金錢。”,過高的資源投入到枯燥的任務中無疑是金錢和資源的浪費。隨著業務流程復雜性的提升,自動化流程也更能顯現出它的有益之處來。圖 1.1 說明了這一問題。

圖1.1 任務規規模越大、越復雜、越頻繁的被執行,那么能從自動化中獲益也越大


人之所以稱之為人,國為我們犯錯誤的頻度遠高于電腦。把一系列任務自動安置到一個作業中,然后再為這個作業創建一個調度器,到時這個作業就會自動執行了。相對于人的手工處理,我們可以減少大多數的出錯機會。

作業調度器的另一個優點體現在伸縮性。我們也許能一個小時中手工完成10或20個作業,但是隨著每小時處理作業數量的增加,我們就更難杜絕不在作業中引入錯誤。但如果借助于作業調度,只會受到硬件資源的影響了。

所以我們能著實的說通過作業調度那樣自動化處理相對于手工來說,至少為我們提供了以下三個優點:

·資源使用效率更高
·更少的出錯機率
·更高的伸縮性

3. 企業應用中的作業調度
“企業應用”一詞,如今經常會被我們無意識間提及,然而似乎現在還沒有對它一個準確的定義。但對于在本書中這一詞的意義,我們只要建立起這樣一個概念:作為某一組織的一部份而存在的軟件系統或程序。這個系統可以是一個大型機上的、或者是一個C/S結構的、或者就是一個J2EE應用。真實世界中的例子就是,作業調度器能在那個系統上大量的使用。以下的幾個場景,盡管沒有詳盡的進行描繪,也涉及到了現今應用軟件常常遇到的場景。

場景 #1: 郵件提醒和告警
許多網站(不管是商業的還是別的)允許用戶提供用戶名和密碼注冊一個帳戶。出于安全考慮,一個好的做法是讓用戶密碼每隔一段時間過期失效,比如說90天的周期。這種情況下,你可以創建一個作業,讓它每天午夜運行一次,并且向離過期時間不到三天的所有用戶發郵件提醒。這里可以恰到好處的用到作業調度器。圖 1.2 描繪了密碼這個提醒作業。

圖 1.2  密碼過期的作業每晚發送郵件給密碼很快會過期的用戶

除了發過期的密碼信息,網站還可以發送其他的告警或提醒(可不是垃圾郵件哦)。一個作業調度器還能夠用在類似的其他方面。

場景 #2: 執行文件傳輸操作
許多商家需要和他們的供應商或客戶作信息集成。一種集成的方式就是進行數據文件的交換。可以采用實時的方式,例如SOAP協議,但是許多時候卻不需要實時性,代之以異步的方式,譬如用FTP協議來發出或取所要的文件。

下圖描繪了一個勞工補償局每天早上收到一些包含患者及事故信息的文件。公司可以雇一個人每天早上手工的檢出FTP服務器上的文件。作為另一個更好的選擇就是可以寫一個作業,讓它每天早上掃描FTP服務器,如果有文件的話,把文件內容處理后插入到患者數據庫中去。讓作業調度器代勞后,這個職員再也不用手工去上FTP檢查文件,而可以為公司做更多別的更有意義的事情。圖1.3 描繪了文件傳輸的操作。

圖 1.3. 文件傳輸的作業檢查FTP站點,把患者信息文件處理到數據庫中。


場景 #3: 創建銷售報表

公司經營由盈虧賬目所驅動,其中一個很重要的事情就是經營管理者和財務人員需要拿到最終收入和毛利數據進行分析。抽取銷售報表數據可能非常的慢并且很耗資源,因為這通常需要聯合多個表從中查詢出上千條記錄。一個更好的解決途徑是在晚上計帳和計價結束后,運行一個作業,讓它去生成一些臨時表或視圖為報表程序所用。創建臨時表或視圖的方式,使報表生成更具動態特性,而且用戶也用不著平白去等待報表的生成,一些報表工具,如水晶報表 XI(Crystal Reports XI) 本身就包含了作業調度器(見圖1.4)。

圖 1.4. 銷售數據報表程序執行為銷售團隊產生收入和毛利信息


4. 非企業應用中的作業調度
Quartz 對于許多非企業環境的應用也是很有幫助的。例如,假定你有一個獨立的應用程序,事件是基于時鐘而不是鼠標的點擊激發的。這時候你就可以把Quartz構建到這個應用程序中來,并且安排事件能周期性的被觸發。

另一例子是,你也許正想查詢數據庫并發送郵件,而郵件接受者正是基于這些數據得到的。(譯者注:真有些搞不明白)

5. 作業調度與工作流

作業調度不是工作流,理解這一點很重的要。它們常被同時應用于一個方案中,但它們是兩個截然不同的解決辦法,并且都可孤立使用。一個作業通常由幾個步驟組成。我們回過頭來看前面提到的那個密碼過期的作業,實質上它是由三個步驟所組成。

   1. 獲取到密碼將要過期的用戶列表
   2. 為列表中的用戶各自發送一個郵件
   3. 更新記錄,下次就能知道哪些郵件發送過

這個作業可以使用工作流的優點,作業的每一部份恰好對應著工作流的每一個步驟。這并非意味著離開了工作流,作業調度會有些糟。這是普通的下一步、下一步簡單操作。只要作業調度框架與第三方工作流能輕便的解決問題,就是好的。更多的關于Quartz和工作流的內容將會在第十四章,“使用Quartz和工作流”詳解。

6. 關于作業調度其他可選擇方案

正如你所知,這本書是講Quartz的,但是Quartz的可替代方案呢?當我們比較作業調度方案的時候肯定要提到別的同類應用,那么現在就來簡單介紹一下它們。

Java SDK Timer 和 TimerTask 類
java.util.Timer和java.util.TimerTask這兩個類是自1.3版本才加入到JDK中來的。這兩個新類可以實現一個最基本的調度器。也就只能作為我們理想的完整調度器框架的一個小的部件。任何嚴格意義的作業調度器都提供直接指定執行時間,存儲作業信息到多種介紹和使用鉤子進行定制及其他更多的功能。單純靠JDK的那兩個類還不足以構建一個真正的作業調度器。JAVA的Timer類也沒辦法對作業和觸發器作相應的組織,使用每任務一個線程,而不是線程池的方式,還有其他不足之處難以成全其實現一個完全意義的作業調度器。

本土方案

從前面提到的Timer和TimerTask類來看,我們很容易低估創建一個靈活的、并且日后可擴展的作業調度器所作出的努力。創建一個作業調度器也不視之為微不足道的活兒。它需要的不僅僅是Java線程方面的專業技術,還需要解決其他更復雜的課題。如果你沒有這方面成熟的專業知識,別想著作業調度器能直接隨意一份草稿能一蹴而就。

商業解決方案

現在市面上也能見到不少商業的作業調度產品。在本書中,我們不打算花功夫去了解和評估那些商業化產品。表1.1 中列出了當下流行的幾個解決方案,你可以通過所給相應的URL獲得更詳盡的信息。

表 1.1 商業作業調度器

名稱 網址
Flux Scheduler www.fluxcorp.com/
Enterprise Batching Queuing www.argent.com/p/qe/qe.html
Unicenter AutoSys Job Management 4.5 www.ca.com
BMC Software ControlM www.bmc.com
Cybermation ESP Espresso 4.2 www.cybermation.corly;9'm
Vexus consulting Avatar Job Scheduling Suite 4.5.5 www.vexus.ca
Argent software The Argent Job Scheduler 4.5A www.argent.com
Tidal Enterprise Scheduler www.tidalsoftware.com