探祕WebSphere Process Server事務性

CloudSpace發表於2009-09-16

Marc Fasbinder, IT 諮詢專家, IBM

轉自:http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0906_fasbinder/0906_fasbinder.html

簡介

IBM® WebSphere Process Server(以下稱為 Process Server)支援不同類別的業務流程。這些流程使用 WS-BPEL 定義,WS-BPEL 是一種短期執行的 “微流程” 樣式,它完全在記憶體中執行。在短期執行流程中,呼叫的服務被繫結到一起,就像一個工作單元一樣;故障發生時,事務性服務能夠回滾。短期執行流程是無狀態的,通常擁有次秒級效能。短期執行流程中的所有任務都是同步的,沒有人員任務。如果您有數千個流程例項正在執行,在它們提交其工作之前它們需要等待數天或數週時間才能完成,這樣您就會遇到死鎖問題。

為了解決這個問題,需要使用另一種長期執行的業務流程類別。這些流程花費幾分鐘、幾小時、幾天甚至幾個月的時間才能完成。它們的狀態在一個資料庫中進行維護,這意味著即使伺服器停止,流程將從它中斷的地方恢復執行。包含人員任務的流程必須始終是長期執行的。預設情況下,長期執行流程中的每一步都是該流程自身的或流程中的一個事務。但是,有一些引數可以控制其行為,本文將討論流程的行為。

本文使用 WebSphere Integration Developer 版本 6.2.0.1 和 WebSphere Process Server 版本 6.2.0.1。本文假定讀者對這兩個產品的知識達到中級水平。

示例專案

為了探索 Process Server 中的事務性概念,我們將使用一個簡單的 “三步” 流程。您可以將本文提供的這個專案的交換檔案 ShortRunningProcess_PI.zip 匯入到您的工作空間,以便跟隨文章進行操作。這個流程是一個帶有三個步驟的短期執行流程,每一步都呼叫一個服務。每個服務都位於它們自身的模組中:

  • 一個 Java™ 元件,它在控制檯中顯示一條訊息。
  • 一個帶有 WebSphere MQ 繫結的匯入,它向一個佇列寫一條訊息。
  • WebSphere Flat File Adapter,它將一條訊息寫到一個文字檔案中。

這個流程使用服務元件架構(SCA)呼叫這三個模組。整合解決方案圖表如圖 1 所示。


圖 1. 解決方案圖
解決方案圖

為了簡化,每個服務使用相同的介面 txnDemoInterface。這個流程將執行一個簡單的 Java 元件,將一條訊息放到一個 MQ 佇列中,然後將它寫入一個平面檔案中。

匯入專案交換檔案之後,將四個模組全部部署到您的伺服器上。

Java 模組

這個 Java 模組包含一個 SCA 輸出,以及一個 Java 元件。生成的 Java 被更新,以便將一條訊息寫入控制檯中(如清單 1 所示)。


清單 1. Java 元件

				
public DataObject runService(DataObject input) {
	System.out.println("Running simple Java...");
	return input;
}

MQ 模組

這個 MQ 模組包含一個 SCA 輸出,以及一個使用 WebSphere MQ 繫結的 Import。這個 Import 針對一個本地佇列管理器和一個本地佇列進行配置(如圖 2 所示)。


圖 2. MQ 匯入設定
MQ 匯入設定

短期執行流程只能呼叫同步服務。因此這個 ToMQ 匯入使用一個單向介面,這個介面將只生成一條訊息。一個雙向介面將等待一個響應。由於介面之間存在不匹配,在匯出和匯入之間要使用一箇中介元件。

更新 End-point configuration 選項卡的值以指向您自己的佇列管理器。如果您的系統上沒有 postcard 佇列,您可以建立一個 postcard 佇列,或者將目標佇列更改為一個已經存在的佇列。

檔案模組

這個檔案模組(如圖 3 所示)包含一個 SCA 匯出,一個外向的 WebSphere Adapter 匯入(使用 WebSphere Adapter for Flat Files),以及一箇中介流。這個介面卡匯入擁有一個與其他工件不同的介面,即它需要一箇中介才能被呼叫。


圖 3. 檔案模組
檔案模組

這個中介對映操作,將輸入資料傳送到介面卡。任何響應或錯誤訊息將被對映到返回訊息中的狀態欄位。圖 4 顯示了返回對映。


圖 4. 中介響應對映
中介響應對映

WebSphere Flat File Adapter 被配置為將輸出寫入到 C:\FileOutput 目錄中的一個檔案。執行流程之前,建立一個目錄以匹配這個名稱,或者更新 FlatFileImport 的配置以指向您的硬碟上的一個現有目錄。

流程

這個流程的初始版本是短期執行的。流程屬性允許您設定流程執行的方式。如圖 5 所示,該流程有一個長期執行標記,用於指定使用哪種流程樣式。Process Server 使用 WebSphere Application Server 中的事務管理器作為它的事務的基礎。對於短期執行流程,事務的邊界就是整個流程。


圖 5. 流程屬性
流程屬性

執行流程

作為一個短期執行流程,預期的行為就是呼叫全部三個服務並執行事務。對於初始測試,啟動伺服器,然後部署所有四個模組。

  1. 選擇 servers 選項卡,然後右鍵單擊您的伺服器。選擇 Add and Remove Projects ...,然後單擊 Add All >> 以將這四個專案新增到您的伺服器。單擊 Finish。這些專案將釋出。這可能要花一些時間,取決於您的系統的速度。
  2. 右鍵單擊該伺服器並選擇 Launch - Business Process Choreographer Explorer。使用使用者 ID admin 和密碼 admin 登入。如果提示一個安全異常,選擇 Yes 繼續。
  3. 單擊 Process Templates。如果這些模組全部部署,您將在列表中看見 TxnProcess。注意,長期執行標記被設定為 no。
  4. 選擇 TxnProcess 核取方塊並單擊 Start Instance(如圖 6 所示)。這將顯示一個表格,用於向流程進行輸入。

    圖 6. 啟動這個流程
    啟動這個流程

  5. 輸入您的名字,一個數量,以及狀態 new。單擊 Submit 以啟動流程。
  6. 檢查控制檯。顯示的訊息是 “Running simple Java”。這顯示這個 Java 元件被呼叫了。
  7. 使用一個工具,比如來自 WebSphere MQ Support Pac IH03 的 RFHUtil,來尋找在名為 postcard 的佇列上的訊息。得到的資料類似於圖 7。

    圖 7. 在 RFHUtil 中顯示的訊息
    在 RFHUtil 中顯示的訊息

  8. 檢查目錄 C:\FileOutput,您將發現兩個檔案。DemoData.seq 是用於索引檔名的序列檔案。DemoData.1.txt 檔案包含資料。編輯這個檔案。您將看到類似於清單 2 的輸出。

    清單 2. 檔案輸出
    						
    
    
    	Marc
    	123
    	New
    
    

    流程輸出訊息顯示在 Business Process Choreographer Explorer 中。來自 Flat File Adapter 的返回程式碼顯示在狀態中(如圖 8 所示)。如果訊息成功寫出,檔案訊息將設定為建立的檔案的名稱。

    圖 8. 流程輸出訊息
    流程輸出訊息

這個流程已經成功執行。您可以刪除這些檔案並從佇列刪除這條訊息,以準備下一次測試。

執行帶有一個故障的流程

現在這個流程正在執行,下一步就是測試事務如何工作。一個簡單的方法就是故意使 Flat File Adapter 產生一個問題,從而導致一個故障。

  1. 使用 Windows® Explorer 刪除 C:\FileOutput 目錄。
  2. 按照上述 1 至 5 步啟動一個新的流程例項。
  3. 這個流程呼叫 Java 元件來顯示這條訊息。
  4. 這個流程將一條訊息寫入 WebSphere MQ 佇列。
  5. 這個流程呼叫 Flat File Adapter,它會導致一個故障。您將看到幾條訊息出現在控制檯中。
  6. 檢查 postcard 佇列,佇列中沒有訊息。

為何會發生這種情況?當短期執行流程啟動時,一個事務就開啟了。前兩個服務呼叫成功,但是當第三個服務返回故障時,這個事務就被回滾。因為您不能夠撤銷在控制檯上寫入的資訊,所以對第一個服務不進行任何操作。對於 MQ 服務,當這個事務回滾時,這條訊息就不會寫入佇列中。

這個測試顯示,當短期執行流程出現故障時,事務就會被回滾。單擊 Servers 選項卡。右鍵單擊您的伺服器並選擇 Add and Remove Projects。選擇 ProcessModuleApp 並單擊 Remove Finish。這個流程的短期執行版本就從伺服器上刪除了。

長期執行流程

在下一個測試中,這個流程需要從短期執行更改為長期執行。您可以進行一些更新,或者匯入 LongRunningProcess_PI.zip 檔案中提供的專案交換檔案。

  1. 展開 ProcessModule - Integration Logic - Processes 並雙擊 TxnProcess。流程編輯器開啟。
  2. 單擊 Properties 選項卡。單擊流程編輯器中的空白區域以選擇流程屬性。
  3. 選擇核取方塊 Process is Long Running
  4. 儲存這個流程。您將在 Problems 檢視中看到兩個錯誤。流程介面的 Join Transaction 修飾符需要設定為 False。您可以在整合編輯器中執行這個步驟。
  5. 流程介面的首選互動樣式應該設定為 Async。遺憾的是,您不能在整合編輯器中更改這個設定。最好的辦法是從整合圖表中刪除這個流程元件,拖動並放下更新後的流程,並將其重新連線到三個匯入上。
  6. 在 ProcessModule 中雙擊 Assembly Diagram,開啟整合編輯器。
  7. 右鍵單擊 TxnProcess 元件並選擇 Delete
  8. TxnProcess 從 ProcessModule 拖動出來並放置到畫布上。
  9. 將來自流程的三個引用都連線到相應的匯入。如果您將滑鼠懸停在一個引用的上方,將顯示一個帶有資訊的彈出視窗(如圖 9 所示)。

    圖 9. 連線流程
    連線流程

  10. 儲存更新後的整合圖表。
  11. 工作空間重構之後,右鍵單擊您的伺服器並選擇 Add and Remove Projects,將 ProccessModuleApp 新增到伺服器並單擊 Finish
  12. 更新後的流程就部署到您的伺服器上了。

執行流程

現在流程已經部署,您可以試著執行它。第一次迭代將建立 C:\FileOutput 目錄,以便 Flat File Adapter 能夠成功寫檔案。

  1. 啟動 Business Process Choreographer Explorer,或者重新登陸(如果它還在執行)。
  2. 單擊 Process Templates,TxnProcess 現在顯示 Long-Running 標記被設定為 yes
  3. 選擇 TxnProcess 核取方塊並單擊 Start Instance
  4. 輸入一個名稱、數量、狀態並單擊 Submit
  5. 訊息 Running Simple Java... 出現在控制檯中。
  6. 一條名為 postcard 的訊息出現在 WebSphere MQ 佇列中。
  7. 一個檔案建立在 C:\FileOutput 目錄中。

長期執行流程與短期執行流程的工作方式類似。

執行帶有一個故障的流程

要測試一個長期執行的流程的事務行為,執行與前面相同的步驟以刪除 c:\FileOutput 目錄,導致 Flat File Adapter 發生一個故障。

  1. 刪除目錄後,啟動另一個流程例項。
  2. 這條訊息出現在控制檯中,訊息之後是錯誤訊息。
  3. 檢查名為 postcard 的 WebSphere MQ 佇列。一條訊息出現在佇列中,即使出現了一個故障。

發生了什麼事?一個長期執行流程的每一步都是該流程自身的或流程中的一個事務。這條訊息寫入佇列後,事務被執行。檔案輸出步驟發生在它自己的事務中。事務失敗時,前面的步驟已經提交了。

  1. 在 Business Process Choreographer Explorer 中,單擊 Process Instances 下面的 Started By Me
  2. 您將看到您的流程狀態為 failed(如圖 10 所示)。

    圖 10. 失敗的流程例項
    失敗的流程例項

  3. 重新建立目錄 C:\FileOutput
  4. 單擊您的流程例項的核取方塊,然後單擊 Activities(如圖 11 所示)。

    圖 11. 選擇流程例項行為
    選擇流程例項行為

  5. 您將看見流程的所有行為,WriteFile 處於失敗狀態。
  6. 選擇 WriteFile 核取方塊並單擊 Restart(如圖 12 所示)。 流程重新啟動並從頭至尾執行。

    圖 12. 重新啟動失敗的行為
    重新啟動失敗的行為

  7. 刪除佇列中的所有訊息,為下一部分進行清理。

為什麼流程必須重新啟動呢?在流程中沒有錯誤控制程式碼,因此故障使流程進入一種稱為 Failed 的狀態(如圖 11 所示)。也可以修改這個流程以便重新執行失敗的步驟,而無需從頭重新啟動。解決這個問題的關鍵是一個叫做 Continue on Error 的屬性,它使流程中的每個行為預設設定為 Yes(如圖 13 所示)。


圖 13. Continue on error
Continue on error

  1. 編輯 TxnProcess,單擊 Properties 選項卡並單擊任務 Write File
  2. Details 選項卡上,將 Continue On Error 更改為 No
  3. 儲存流程並將 ProcessModuleApp 釋出到伺服器。
  4. 確認目錄 c:\FileOutput 不存在。
  5. 從 Business Process Choreographer Explorer 轉到 Process Templates 檢視並啟動流程的一個例項。
  6. 流程執行,直到 Write File 步驟發生故障。
  7. 單擊 Process Instances - Started By Me。注意,這個流程處於 Running 狀態,而不是 Failed 狀態。
  8. 選擇您的流程例項的核取方塊,然後單擊 Activities。將顯示您的流程的行為列表。這次,WriteFile 步驟處於 Stopped 狀態而不是 Failed,這允許您執行那些對失敗的行為無效的操作。
  9. 再次建立 c:\FileOutput 目錄,以便該行為可以成功執行。
  10. 在 Business Process Choreographer Explorer 中,選擇 WriteFile 核取方塊並單擊 Restart(如圖 14 所示)。

    圖 14. 重新啟動 WriteFile
    重新啟動 WriteFile

  11. Activity Restart 螢幕出現,顯示流程資料。單擊 Restart 按鈕。這次,WriteFile 行為成功執行。確認檔案已經建立。
  12. 從佇列刪除訊息並刪除 c:\FileOutput 目錄,準備進行下一部分。

如果您不打算處理您的流程中的故障,您可以使用 Continue On Error 屬性允許授權的流程管理員修復失敗的流程,而不是必須從頭重新啟動。您還可以執行一個 Force Complete,該操作允許您手動輸入輸出資料,完成任務,然後恢復流程。

高階事務設定

在長期執行流程中,預設行為是使每個行為作為自身的事務執行。您也可以為長期執行的業務流程中的步驟指定事務行為。對於每一個流程行為,您可以選擇一個屬性來設定事務(如圖 15 所示)。


圖 15. 事務行為
事務行為

使用這些設定,您可以使一個長期執行流程中的多個行為在一個事務中執行。例如,如果您有一個包含兩個服務呼叫的人員任務,您可以為這兩個服務使用一個事務。

除了這個設定,SCA 修飾符也很重要。一個 SCA 修飾符將覆蓋流程設定。如果您正在呼叫的一個元件無法參與一個全域性事務,它將在該元件執行前強迫執行一個提交。要探祕這種行為,編輯 ProcessModule 的整合圖表。

  1. 編輯 TxnProcess。對於 Call MQWrite File,單擊 Server 選項卡並將 Transactional Behavior. 設定為 Participates。現在,這三個步驟都標記為在一個事務中執行。儲存流程。
  2. 展開 ProcessModule 並雙擊 Assembly Diagram。整合圖表編輯器開啟。
  3. 右鍵單擊 TxnProcess 並選擇 Show Transaction from Here。您將看見一個類似於圖 16 的介面。

    圖 16. 事務邊界
    事務邊界

    這裡發生了什麼事?這個流程中的兩個行為都設定為參與一個事務,但是隻有 SendToMQ 顯示在這個事務中。問題就出在 SCA 修飾符。
  4. 展開 FileModule 並雙擊 Assembly Diagram
  5. Properties 選項卡中,單擊 Qualifiers。這個模組的 SCA 修飾符被顯示(如圖 17 所示)。

    圖 17. FileModule 的 SCA 修飾符
    FileModule 的 SCA 修飾符

FlatFileImport 的 Join transaction 修飾符被設定為 False,這覆蓋了流程中的設定,這就是圖 16 中顯示的事務只包含 SendToMQ 的原因。要將這個修飾符設定為 True,您必須通過一個同步介面來呼叫這個服務。

補償

如果您想要在一個事務中使用一個服務,但這個服務是非事務性服務,這時會發生什麼情況呢?在 txnProcess 中,正在被呼叫的服務是同步的,這表示它不能加入這個事務。解決方法是一個稱為補償(compensation) 的概念。

補償使一個長期執行的業務流程具有像短期執行流程一樣的服務特性。那些已經被呼叫和提交的服務通過使用補償控制程式碼來 “撤銷”。

  • 如果一個服務新增一條記錄,補償則刪除這條記錄。
  • 如果一個服務更新一條記錄,補償則恢復原始值。
  • 如果一個服務刪除一條記錄,補償則恢復這條記錄。

並不是流程中的每一個步驟都需要撤銷。您不能 “撤銷” 文件列印操作。某人不能 “撤銷之前” 批准了的請求。通常,補償將撤銷部分自動服務,這些自動服務被流程呼叫。補償也可以用於短期執行流程中已呼叫的服務不能加入一個事務的情況。

要閱讀關於補償的一篇詳細文章,參閱 在執行於 Business Process Choreographer 的業務流程中使用補償

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14789789/viewspace-614787/,如需轉載,請註明出處,否則將追究法律責任。

相關文章