程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> WebSphere >> 在WebSphere Process Server中為新的查詢要求設置自定義屬性

在WebSphere Process Server中為新的查詢要求設置自定義屬性

編輯:WebSphere

簡介

在您開發一個業務流程客戶端程序時,您經常需要在一個流程實例內,通過某些業務數據標准來查詢流程實例、活動和任務。 例如,您可能想要在流程實例中尋找與某個 ID 的客戶相關的所有任務。

當您在 WebSphere Integration Developer(以下簡稱為 Integration Developer)設計流程時,可以通過為人工任務設置自定義屬性來實現這個需求。然而,當流程投入使用後,如果新查詢要求需要 新的自定義屬性,那麼這招就不靈了。您當然可以使用 WebSphere Process Server(以下簡稱為 Process Server)提供的流程版本控制方法 ,在新版業務流程中增加新的自定義屬性。然而,使用新的自定義屬性不能對已有的舊版業務流程進行查詢。

本文對熟悉業務流程開發 的業務流程設計師和程序員有一定的幫助。本文假設您熟悉 Process Server 和用 Integration Developer 開發業務流程應用程序。

在本文中,我們假設 Integration Developer V6.1.2 已得到合理安裝。

本文介紹一種動態的方法,該方法使用 Business Process Choreographer(BPC) EJB API 來為正在運行的業務流程實例設置自定義屬性,從而解決此類問題。

我們將利用一個簡單的命令審計流 程來說明這個解決方案。樣例流程工作流包括以下典型步驟:

客戶提交一個訂單請求,其中含有用戶和審計人員的信息。

審計 人員批准或拒絕請求。

最後,當審計人員批准或拒絕請求後,系統給客戶一個響應。

樣例和模塊將在以下幾節描述。

准 備樣例流程項目

使用准備好的業務流程按如下方式導入項目交換文件:

下載提供的 OrderDemo.zip 文件,並將其保存到一個臨 時目錄中。

在 WebSphere Integration Developer 中,單擊 File -> Import。Import 對話框打開。

選擇 Project Interchange。

單擊 Next。Import Project Interchange Contents 窗口打開(如圖 1 所示)。

1. Import 對話框

單擊 “From zip file” 旁邊的 Browse。

浏覽臨時目錄,選擇第 1 步中下載的壓縮文件。

單擊 Open。

選擇您的工作空間目錄作 為您的 Project location root。

單擊 Select All。

單擊 Finish。

您需要使用與上面相似的步驟,將提供的包含流程 數據類型的 OrderDemoLib.zip 導入工作空間。您將得到如圖 2 所示的項目結構。以下部分將對此做詳細解釋。

圖 2. 流程項目結構

業務對象和 BPEL 流 程

訂單審計流程有兩個必需的業務對象(BO):OrderRequest 和 PersonInfo(見圖 3)。OrderRequest 保存訂單信息,包括客戶、 審計人員、狀態和商品編號。PersonInfo 包含個人信息,比如 ID、姓名和地址。

圖 3. 業務對象

圖 4 展示了 Integration Developer BPEL 中設計的流程:

Receive 活動是流程的起始點。流程從客戶端收到一個消息(OrderRequest),接著開始流程。消息中的數據存儲在一 個流程變量(請求)中。

Assign 活動執行該流程所需的數據映射。

Order Info 片段打印訂單信息。

ApproveOrderRequest 是審計人員批准或拒絕請求的一個人工任務。

Approve 選項根據審計人員的決議決定下一步。系統將使 用 Approve Response 和 Reject Response 片段打印相應的回復。

4. 流程

使用 BPC Explorer 運行樣例

在嵌入 Integration Developer 的測試服務器上部署了 OrderDemoApp 之後,使用 Business Process Choreographer (BPC) Explorer 運行樣例,步 驟如下:

在 “My Process Templates” 頁面(見圖 5)上選擇 OrderProcess,然後單擊 Start Instance。

5. 流程模板

填寫 Process Input Message 部分並單擊 Submit (見圖 6)。

6. Process Input Message

在 My To-dos 頁面(見圖 7)上處理 ApproveOrderRequest 人工任務工作。

7. My To-dos

輸入 Task Output Message(true 表示批准 ,false 表示拒絕)。單擊 Complete(見圖 8)。

8. 處理 Task Message

在控制台上(見圖 9),您可以看到測試結 果(日志以 Java™ 片段打印)。

9. 控制台

為何需要設置自定義屬性

一般來說, 您需要開發一個客戶端應用程序來啟動和完成流程實例,而不是使用 BPC Explorer。WebSphere Process Server V6 提供 BPC EJB API 來訪 問和處理業務流程和人工任務。事實上,有兩個獨立的 API 集合:Business Flow Manager API 和 Human Task Manager API。

當我們 建立流程客戶端應用程序時,常常希望定位一個特定的流程實例或人工任務,其業務數據滿足某個標准。例如,可能需要通過特定的訂單號尋 找流程實例。

這部分說明了為什麼您需要為查詢要求設置自定義屬性。查詢出任務之前,您需要啟動流程實例。

您可以使用與 導入流程項目的類似的步驟,將提供的 OrderProcessExport.zip 導入您的工作空間。該項目的所有代碼片段在本項目後面部分都能找到。

清單 1 顯示了這些使用 Business Flow Manager API 來啟動一個帶有輸入消息的 “OrderProcess” 實例的代碼片段。

清單 1. 使用 BPC EJB API 啟動流程

// Create the input ClientObjectWrapper 
com.ibm.bpe.api.ClientObjectWrapper cow = flows.createMessage( 
 processTemplate.getID(),  processTemplate.getInputMessageTypeName());
// Get the Input DataObject from the ClientObjectWrapper 
DataObject dataObject = (DataObject) cow.getObject();

dataObject.setDataObject("request", OrderRequest);
//Initiate process instance 
com.ibm.bpe.api.PIID piid = flows.initiate("OrderProcess", cow);

流程 實例啟動後,名為 “ApproveOrderRequest” 的人工任務將被啟動,等待審計人員完成。完成任務之前,您需要通過訂單號查詢出 任務。清單 2 顯示了使用 Human Task Manager 通過訂單號過濾任務的代碼片段 。

清單 2. 通過訂單號獲取特定待處理任務

QueryResultSet instances = htms.query("DISTINCT TASK.TKIID",
 "TASK.NAME='OrderProcess$ApproveOrderRequestTask' AND
TASK.STATE=TASK.STATE.STATE_READY", null, null, null,  null);

while (instances != null && instances.next()) {
 TKIID tkiid = (TKIID)  instances.getOID(1);

 ClientObjectWrapper cow = htms.getInputMessage(tkiid.toString());
 DataObject  input = (DataObject) cow.getObject();

 if (orderNo.equals(input.getString("orderNo"))) {
  System.out.println("find!!!");
 }
}

您可以在預定義的 BPC 數據庫視圖上執行 SQL 查詢。然而,像在輸入消 息(業務對象)中定義的訂單號這類業務數據,在數據庫視圖中不能查詢。您不得不通過流程的輸入消息從所有待處理任務中過濾。如果審計 人員有很多待處理任務,這個方法將可能導致性能問題。您也需要改進查詢方法和自定義屬性來滿足您的需求。您可以指定業務流程自定義屬 性及其所有的基本活動。一個自定義屬性有一個名稱和一個可選值(字符串)。BPC 數 據 庫 提 供一個 PROCESS_ATTRIBUTE 視圖,您可以使 用該視圖查詢流程人工任務,方法是將訂單號定義為流程自定義屬性。

除了性能問題之外,還有另一個重要的原因:如果在流程的輸入 消息中不包含查詢標准,您就不能用輸入消息過濾實例。然而您可以用 BPC EJB API 設置標准作為自定義屬性來滿足這類需求 。

根據 自定義屬性執行查詢之前,您需要為流程實例設置自定義屬性。

如何設置自定義屬性

當啟動流程實例時,您可以使用 BPEL 流 程中的一個 Java 片段或 BPC EJB API 來設置自定義屬性。下面將分別介紹這兩種方法。

在 Integration Developer 中使用 Java 片 段設置自定義屬性

您可以在流程的開始增加一個 Java 片段。輸入以下設置語句,如圖 10 所示:

setProcessCustomProperty (“orderNo”, orderNo);

圖 10. 使用 Java 片段設置流程自定義屬性

使用 BPC EJB API 設置自定義屬性

流程實例啟動之後,您也可以使用 BPC EJB API 將訂單號設置為自定義屬性,如清單 3 所示。

清單 3. 使用 BPC EJB API 設置自定義屬性

String orderNo = request.getString("orderNo");
if  (orderNo != null && !"".equals(orderNo)) {
 bfms.setCustomProperty(piid, "orderNo", orderNo);
}

流程啟動之後,您可以在 BPC Explorer 中查看自定義屬性,如圖 11所示。

圖 11. 檢查現有流程實例屬性

通過預定義的自定義屬性查詢 待處理任務

您可以使用預定義的數據庫視圖 PROCESS_ATTRIBUTE 查詢自定義屬性,如表 1 所示。

表 1. PROCESS_ATTRIBUT 視 圖

列名 類型 注釋 PIID ID 含有一個自定義屬性的流程實 例的 ID。 NAME String 自定義屬性的名稱。 VALUE String 自定義屬性值。

清單 4 顯示了如何通過自定義屬性查詢待處理任務。

清單 4. 通過自定義屬性查詢 待處理任務

QueryResultSet instances = htms.query("DISTINCT TASK.TKIID",
 "WORK_ITEM.OBJECT_ID =  TASK.TKIID AND WORK_ITEM.ASSOC_OID = PROCESS_ATTRIBUTE.PIID AND
 PROCESS_ATTRIBUTE.NAME= 'orderNo' AND  PROCESS_ATTRIBUTE.VALUE ='" + orderNo + "' AND
 (TASK.STATE = TASK.STATE.STATE_READY OR TASK.STATE =  TASK.STATE.STATE_CLAIMED ) AND
 TASK.SUSPENDED = FALSE AND WORK_ITEM.REASON=1 AND WORK_ITEM.OBJECT_TYPE=5  ",
 null, null, null, null);

if (instances.size() > 0) {
 instances.first();
 TKIID  tkiid = (TKIID) instances.getOID(1);
 ClientObjectWrapper cow = htms.getInputMessage(tkiid.toString());
  DataObject input = (DataObject) cow.getObject();

}

您可以使用查詢、通過自定義屬性直接獲取訂單號的 任務 ID。這將會產生較好的性能。

如何滿足新的查詢要求

如果在業務流程運行之後,出現一個新的查詢要求,此時,您該做什 麼?例如,您想要根據 customerId 而非 orderNo 查詢流程實例。您需要添加一個新的名為 “customerId” 的自定義屬性來支持 新的查詢要求。如您所知,樣例流程是一個長期流程,就是說,可能有多個實例運行在生產服務器上。這意味著您需要添加新的自定義屬性, 不僅要為新啟動的流程實例添加,也要為服務器上已存的實例添加。

為新啟動的流程實例設置新自定義屬性

有兩種方法來實現 這個要求。您可以實現一個新版業務流程,在 Java 片段中添加新的自定義屬性。對於版本控制方法,參見 Versioning business processes and human tasks in WebSphere Process Server。另一種方法是,為新啟動的流程實例添加新的自定義屬性 customerId。對於第二種方法, 您不需要進行流程版本控制。

從這個角度來看,使用 BPC EBJ API 比在 BPEL 流程中設置自定義屬性要好一些。有了 API,您可以根 據需求變化動態地添加新的客戶屬性,而不需要對 BPEL 流程進行版本控制。清單 5 顯示了如何使用 BPC EJB API 設置一個新的自定義屬性 。

清單 5. 為新啟動的實例設置自定義屬性

//Initiate the process instance as usual
com.ibm.bpe.api.PIID piid = flows.initiate("orderProcess", cow);
//Set custom property after process instance  is initiated.
flows.setCustomProperty(piid, "orderNo",“000001”);
flows.setCustomProperty(piid,  "customerId",“C00001”);

現在,您可以根據新的自定義屬性 customerId 來查詢待處理任務,從而滿足新的需 求。

為運行中的流程實例設置新自定義屬性

通過使用 BPC EJB API,您可以搜索運行中的流程實例,並為其添加一個新自定義 屬性。清單 6 顯示了如何為運行中的實例添加一個新自定義屬性。

清單 6. 為運行中的實例設置自定義屬性

QueryResultSet instances = flows.query("DISTINCT PROCESS_INSTANCE.PIID",
 "PROCESS_INSTANCE.STATE =  2 AND PROCESS_INSTANCE.TEMPLATE_NAME 
 ='OrderProcess' ", "", null, null);

while (instances .next ())
{
 PIID piid = (PIID) result.getOID(1);
 flows.setCustomProperty(piid, "customerId",  customerIdValue);

}

根據自定義屬性查詢待處理任務

就像根據 orderNo 查詢待處理任務那樣,現在,您 可以根據 customerId (見清單 7)執行查詢。

清單 7. 根據新的自定義屬性查詢待處理任務

QueryResultSet  instances = htms.query("DISTINCT TASK.TKIID", "WORK_ITEM.OBJECT_ID
 = TASK.TKIID AND WORK_ITEM.ASSOC_OID =  PROCESS_ATTRIBUTE.PIID AND
 PROCESS_ATTRIBUTE.NAME= 'customerId' AND PROCESS_ATTRIBUTE.VALUE ='" + customerId
 + "' AND (TASK.STATE = TASK.STATE.STATE_READY OR TASK.STATE = TASK.STATE.STATE_CLAIMED )
 AND  TASK.SUSPENDED = FALSE AND WORK_ITEM.REASON=1 AND WORK_ITEM.OBJECT_TYPE=5 ", null,
 null, null, null);
if (instances.size() > 0) {
 instances.first();
 TKIID tkiid = (TKIID) instances.getOID(1);
  ClientObjectWrapper cow = htms.getInputMessage(tkiid.toString());
 DataObject input = (DataObject)  cow.getObject();
 System.out.println("find customerId:" + customerId + " orderNo: 
   " +  input.getString("orderNo"));
}

在 Integration Developer 中測試客戶端應用程序

您可以測試 OrderProcessExport 項目,這是一個實現了流程實例的啟動和查詢的 Java 客戶端應用程序。將兩個模塊 OrderDemo 和 OrderProcessExport 部署到 Integration Developer 中的測試服務器之後,您可以在 Integration Developer中使用測試模塊測試該項功能。

圖 12. 在 Integration Developer 中測試客戶端應用程序

您可以參考函數描述(表 2)來執行測試。

表 2. PROCESS_ATTRIBUTE 視圖

方法名 功能 initProcess 啟動一個新的流程實例。 initProcessWithOrderNo 啟動一個新的流程實例並為該實例設置自定義屬性 orderNo。 initProcessWithCustomerId 啟動一個新流程實例 ,並為該實例設置自定義屬性 customerId。 queryTodoTaskByOrderNo 根據請求的 orderNo 查詢特定待處理任 務。 queryTodoTaskByCustom
PropertyWithOrderNo 根據自定義屬性 orderNo 查詢特定待處理任務。 queryTodoTaskByCustom
PropertyWithCustomerId 根據自定義屬性 cusomerId 查詢特定待處理任務。 addCustomPropertyFor
RunningProcess 為運行中的流程實例添加新的自定義屬性。

結束語

基於業務流程的應用程序包括長期實例,這種實例可以運行幾周、幾月、甚至幾年。業務需求隨時間而 變化。WebSphere Process Server V6.1 提供一個稱為 “流程版本控制” 的技術,來幫助升級基於業務流程的應用程序,以滿足 新環境和業務需求。然而,您還需要修改已有的實例來滿足新的查詢要求。本文介紹了一種動態方法,它使用 Business Process Choreographer EJB API 來為新流程實例和運行中的實例設置自定義屬性,從而滿足新的查詢要求。使用這種方法,您不需要更新流程來添加 一個新的自定義屬性。

下載

描述 名字 大小 下載方法 樣例腳本 OrderDemo.zip 11KB HTTP 樣例腳本 OrderDemoLib.zip 5KB HTTP 樣例腳本 OrderProcessExport.zip 2,012KB HTTP
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved