http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0502_gadepalli/0502_gadepalli.html
Varadarajan Ramamoorthy, IT 顧問專家, IBM Raleigh 實驗室 Vishy Gadepalli, 高級軟件工程師, IBM Raleigh 實驗室
2005 年 3 月
本文顯示了如何創(chuàng)建 portlet 向業(yè)務(wù)流程提供輸入和接收業(yè)務(wù)流程的輸出。用戶可以使用 Process Choreographer 提供的業(yè)務(wù)流程 Java API 來調(diào)用業(yè)務(wù)流程。本文同時包含了可供下載的樣本代碼。
引言 IBM? WebSphere? Portal V5.1 將業(yè)務(wù)流程功能集成到門戶部署中了。這種支持技術(shù)利用 WebSphere Portal (WP) 流程管理接口向很多企業(yè)提供了新的用于使用 WebSphere Business Integration Server Foundation (WBISF) Process Choreography 組件的選項。
例如,Process Choreographer 提供了缺省的 Web 客戶端,用戶可以使用它與為創(chuàng)建中斷性或者非中斷性的業(yè)務(wù)流程的任務(wù)進(jìn)行交互。用戶可以列出流程模板,輸入數(shù)據(jù),實例化流程,并與創(chuàng)建為 Staff 和 Receive 活動的用戶工作條目一起工作。盡管這種客戶端接口有利于在業(yè)務(wù)活動的部署期間進(jìn)行測試,但是它并不是用戶想要提供給其最終用戶的接口類型。
需要為您的用戶以 Web 應(yīng)用程序的方式或者在 WebSphere Portal 中運行 portlet 的方式開發(fā)自己的定制用戶接口。用戶最有可能使用 Process Choreographer 提供的開放 Java? API(本文中涉及到的 API 均稱為 BPE API)與流程引擎進(jìn)行交互。
本文描述了如何如何使用 Business Process Engine (BPE) API 來創(chuàng)建 portlet 以調(diào)用業(yè)務(wù)流程。為了領(lǐng)會本文的大部分內(nèi)容,用戶需要了解 Process Choreographer、Web 服務(wù)、業(yè)務(wù)流程引擎和 WebSphere Portal。
理解流程的類型 在深入了解實際編寫 portlet 的詳細(xì)資料之前,我們首先看一看流程的兩種基本類型:
- 可中斷性流程是長時間運行并且由事務(wù)服務(wù)組成的流程類型。用于批準(zhǔn) loan 應(yīng)用程序的流程就是這樣的一個實例。
- 非中斷性流程是短期存活的操作行為,組合起來形成單獨的事務(wù)操作,信用卡的確認(rèn)就是一例。
可中斷性流程 如果流程的每個步驟都運行在自己的物理事物中,那么該業(yè)務(wù)流程就是可中斷性流程。可中斷性流程通常都是長期運行的流程。如果業(yè)務(wù)流程需要等待外部激勵或者包括了用戶之間的交互,那么該業(yè)務(wù)流程就必需是可間斷的。外部激勵的例子有:
- 在企業(yè)對企業(yè)的交互中由另一個業(yè)務(wù)流程發(fā)送的事件
- 對異步調(diào)用行為的響應(yīng)
- 完成員工活動
可中斷性流程有以下特征:
- 作為一些事務(wù)運行
- 由同步服務(wù)和異步服務(wù)組成
- 通過初始方法或者 sendMessage 方法啟動,因為不能同步檢索輸出消息
- 正常情況下會運行很長的時間
- 能持久地保存運行時值
非中斷性流程 非中斷性業(yè)務(wù)流程以單線程的方式運行,從啟動到結(jié)束期間是不可中斷的。非中斷性流程也稱為 microflows。這些流程有不同的事務(wù)能力。它們能夠作為活動會話的一部分運行在分布式事務(wù)中,或者和本地事務(wù)一起運行。
非中斷性流程具有以下特征:
- 作為單一事務(wù)運行。
- 只由同步服務(wù)和非中斷性子流程組成。這就意味著非中斷性流程不能包括:
- 全體活動或者等待活動
- 異步調(diào)用
- 多個接受活動
- 可中斷性子流程
- 使用調(diào)用方法的方式啟動,以便在流程結(jié)束后返回輸出消息。
- 通常運行時間較短。
- 在數(shù)據(jù)庫中不保存運行時值。
- 不包括中斷性流程。
介紹本文的場景 本文的場景是創(chuàng)建了能夠通過調(diào)用流程來返回存儲的參數(shù)值的簡易 portlet 。為證券報價定義的流程是一個簡單的非中斷性流程。用戶可以查看使用 portlet 調(diào)用該流程的步驟。
樣本代碼 下載中提供了支持該場景的代碼。
軟件需求 要實現(xiàn)該場景,用戶至少擁有一種以下所示的環(huán)境:
- IBM WebSphere Business Integration Server Foundation 5.1.x 下的 IBM WebSphere Portal V5.0.2.2 (以下簡稱 Server Foundation)
- Server Foundation 下的 IBM WebSphere Portal V5.1
用戶還需要使用配置了 WebSphere Portal Toolkit 的 IBM WebSphere Studio Application Developer Integration Edition 5.1.x (以下簡稱 Application Developer)。
來自 portlet 的通信機(jī)制 在 portlet 和流程之間存在多個通信選擇項。
使用 BPE API BPE API 為開發(fā)用于基于 Business Process Execution Language (BPEL) 的流程的應(yīng)用程序提供了以下表現(xiàn):
- Enterprise JavaBean (EJB) 表現(xiàn),它能實現(xiàn) API 的本地或者遠(yuǎn)程調(diào)用。用于每種調(diào)用類型(LocalBusinessProcess 接口和 BusinessProcess 接口)的無狀態(tài)會話 bean 顯示了應(yīng)用程序能調(diào)用的函數(shù)。BusinessProcessService 接口為這些會話 bean 提供了一種公用接口。
- Java Message Service (JMS) 表現(xiàn),它使得使用 JMS 能夠遠(yuǎn)程調(diào)用 API 函數(shù)的子集。
使用 Web 服務(wù)客戶端 或者,可以將該流程顯示為 Web 服務(wù)。那么就可以生成用于 Web 服務(wù)的 Java 代理,并使用代理實例化流程。
本文將討論使用 BPE API 和 EJB 調(diào)用流程。
準(zhǔn)備部署流程 portlet 為部署流程 portlet,需要在 Application Developer 中創(chuàng)建一個項目,并使所需要的庫文件可用。
創(chuàng)建 portlet 項目 首先,創(chuàng)建一個 portlet 項目:
- 在 Application Developer 中選擇 File => New => Portlet Application Project。
提示: 如果用戶在 New 下面看不到 Portlet Application Project,單擊 Other,然后選擇 Portlet Development => Portlet Application Project。
- 將項目命名為
ProcessStarter ,然后選擇 Basic Portlet,如圖 1 所示。
圖 1. 創(chuàng)建 portlet 項目
- 單擊 Next。
- 單擊并且確定以下初始化屏幕上的缺省設(shè)置,直到用戶看到 Event Handling 屏幕。
- 取消 Add Action Listener,然后單擊 Finish。
圖 2. 完成 portlet 項目的創(chuàng)建
可以看到 Application Developer 中創(chuàng)建的新框架 portlet 項目。
訪問所需的庫文件 既然已經(jīng)創(chuàng)建了portlet 項目,還需要使用于調(diào)用事務(wù)流程 API 的庫文件 JAR 可用于 Application Developer。可以通過將以下的 jar 文件從運行流程引擎的 Server Foundation 中復(fù)制到該 portlet 的 WEB-INF\lib 文件夾中來完成該操作,如下圖 3 所示,其中 <WAS_51_ROOT> 是安裝 Server Foundation 的位置。
- <WAS_51_ROOT>\ProcessChoreographer\client\bpe137650.jar
- <WAS_51_ROOT>\ProcessChoreographer\client\bpeapi.jar
- <WAS_51_ROOT>\ProcessChoreographer\client\processportal.jar
- <WAS_51_ROOT>\lib\wsif.jar
復(fù)制這些庫文件:
- 打開 Window 瀏覽器,然后選擇這些 jar 文件。
- 單擊右鍵,然后選擇 Copy(或者按動 CTRL-C)。
- 在 Application Developer 中,展開然后選擇 Portlet Project 文件夾的 WEB-INF\lib。
- 單擊右鍵,然后選擇 Paste。
圖 3. 將庫文件復(fù)制到 Application Developer 中
還需要向 portlet 項目的創(chuàng)建路徑中添加下列 JAR 文件。
- WAS_50_PLUGINDIR/lib/qname.jar
- WAS_50_PLUGINDIR/lib/wsdl4j.jar
在 Application Developer 中添加 JAR 文件:
- 選擇瀏覽器視圖中的 portlet 項目。
- 單擊右鍵,然后選擇 Properties。
- 選擇 Java Build Path。
- 在庫文件的選項卡上,單擊 Add Variable。
- 添加 wsdl4j.jar 和 qname.jar。
- 單擊 OK,然后退出屬性窗口。
現(xiàn)在已經(jīng)完成了 portlet 項目的設(shè)置程序,這樣會便于用戶開發(fā)流程 portal portlet 。
開發(fā) portlet 解壓 下載 文件,并且將其內(nèi)容解壓到用戶所選的目錄中。
將從 zip 文件中解壓出的 ProcessStarterPortlet.java 文件中的內(nèi)容進(jìn)行復(fù)制,并且將其粘貼到 Application Developer 編輯器的 ProccessStarterPortlet 中。
檢查提供的代碼 接下來查看代碼的主要部分以理解 portlet 是如何使用 BPE API 的。
獲取業(yè)務(wù)流程引擎 EJB
portlet 能使用運行在流程服務(wù)器上的無狀態(tài)會話 bean 與流程引擎進(jìn)行通信。為訪問此 EJB,代碼在流程機(jī)器上執(zhí)行 JNDI 查詢以查找 com/ibm/bpe/api/BusinessProcessHome 來獲得 home object 并利用它創(chuàng)建業(yè)務(wù)流程 EJB 對象。該代碼就在 portlet 的 init() 方法中。清單 1 中的代碼片斷顯示了如何訪問 EJB 。 清單 1. 訪問 EJB
java.util.Hashtable env = new java.util.Hashtable();
String corbaloc = "corbaloc:iiop:localhost:2809";
env.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY,
"com.ibm.websphere.naming.WsnInitialContextFactory");
env.put(javax.naming.Context.PROVIDER_URL, corbaloc);
javax.naming.Context choreographyContext =
new javax.naming.InitialContext (env);
Object o = choreographyContext.lookup
("com/ibm/bpe/api/BusinessProcessHome");
com.ibm.bpe.api.BusinessProcessHome bph =
(com.ibm.bpe.api.BusinessProcessHome)
javax.rmi.PortableRemoteObject.narrow
(o, com.ibm.bpe.api.BusinessProcessHome.class);
businessProcess = bph.create ();
|
調(diào)用流程 API
我們現(xiàn)在來看一下幾個關(guān)鍵的 API 。
流程模板是一個經(jīng)過翻譯、部署以及安裝的流程模型,它包括業(yè)務(wù)流程規(guī)范。用戶可以使用 ProcessTemplateData 來查詢流程模板的數(shù)據(jù),它能返回很多信息,例如這些信息包括該流程是否是長期運行的流程,還包括它所獲得輸入消息清單以及輸出消息清單等。清單 2 中的代碼片斷顯示了用戶如何訪問 ProcessTemplateData 對象以及查詢輸入消息的類型,這些消息正是用戶所期望的。 清單 2. 查詢 ProcessTemplateData 對象
ProcessTemplateData templateData =
BusinessProcess.getProcessTemplate(templateName);
String inputTypeName =
templateData.getInputMessageTypeName();
|
用戶使用 ClientObjectWrapper 在調(diào)用者和流程引擎之間封裝消息和變量。
當(dāng)通過 EJB 接口訪問流程引擎時:
- 調(diào)用參量自動由應(yīng)用程序服務(wù)器反序列化。
- 消息和變量都被反序列化。
ClientObjectWrapper 類將反序列化操作延遲,直到能訪問封裝的消息或者變量為止,這樣流程引擎才能夠建立適當(dāng)?shù)念愌b載器。
如果用戶有包括復(fù)雜數(shù)據(jù)類型的消息,那么必需從該流程中獲得包含類的客戶端 jar 文件,并將其復(fù)制到 portlet 的 WEB-INF/lib 中。 下載 中的代碼演示了如何獲得這些數(shù)據(jù)類型。用戶得到的類型就是在 XSD 中定義的類型,它們并不是 Java 類型。因此,不能調(diào)用 instanceof 來檢查數(shù)據(jù)類型。
封裝器包括 WSIFMessage,它是一組指定部件的容器。清單 3 顯示了用戶如何迭代以獲得 WSIFMessage 中的部件。 清單 3. 訪問的 WSIFMessage 的部件
ClientObjectWrapper replyWrapper = ...
WSIFMessage wsifMessage = (WSIFMessage)
replyWrapper.getObject();
Iterator partNames = wsifMessage.getPartNames();
while (partNames.hasNext()) {
String partName = (String) partNames.next();
Object partValue = wsifMessage.getObjectPart(partName);
}
|
清單 4 顯示了如何獲得消息的底層 WSDL 模型,例如在用戶得到了要提交的輸入數(shù)據(jù)清單時就需要如此操作。 清單 4. 訪問消息的 WSDL 模型
WSIFMessage inputMessage = … ;
Map inputParts =
inputMessage.getMessageDefinition().getParts();
Iterator partNames = inputParts.keySet().iterator();
while (partNames.hasNext()) {
String partName = (String) partNames.next();
}
|
創(chuàng)建輸入 JSP 現(xiàn)在可以開始準(zhǔn)備創(chuàng)建用于輸入數(shù)據(jù)的 JSP。
將下載 zip 文件的 ProcessStarterPortletView.jsp 代碼內(nèi)容復(fù)制到用戶 portlet 項目 jsp/html 目錄中的 ProcessStarterPortletView.jsp 中。
ProcessStarterPortletView JSP 將 stock 符號作為輸入,并將其發(fā)送到 portlet 中處理,如圖 6 所示。
創(chuàng)建輸出 JSP 接下來需要添加 JSP 來顯示 stock 查詢。
- 選擇 html 文件夾。
- 單擊右鍵,然后選擇 New => JSP File。
- 將其命名為 ProcessStarterOutput.jsp,如圖 4 所示。
圖 4. 創(chuàng)建輸出 JSP
- 復(fù)制 zip 文件中 ProcessStarterOutput.jsp 的代碼,并且將其粘貼到剛剛創(chuàng)建的 JSP 文件中。
顯示流程的 PIID 當(dāng)此代碼實例化可中斷性流程時,它相應(yīng)地獲得了一個 Process Instance Identifier (PIID)。要顯示該 PIID ,需要創(chuàng)建一個 JSP。
- 按照前面章節(jié)所述的步驟再創(chuàng)建一個 JSP 文件,命名為 ProcessStarterOutputWSIF.jsp。
- 復(fù)制 zip 文件中 ProcessStarterOutputWSIF.jsp 的內(nèi)容,并且將其粘貼到剛剛創(chuàng)建的 JSP 中。
測試 portlet 下載的文件中還包含另一個 EAR 文件,即 StockProcessSample.ear,它包括運行該流程的應(yīng)用程序。
測試該 portlet:
- 使用 WebSphere Application Server,如同在 WebSphere Portal 應(yīng)用服務(wù)器中安裝單獨的企業(yè)應(yīng)用程序一樣來安裝
StockProcessSample.ear 文件。
- 接下來,在項目上單擊右鍵,然后選擇導(dǎo)出,將 portlet 項目作為 WAR 文件從 Application Developer 中導(dǎo)出。
- 在導(dǎo)出屏幕中選擇 Export as a war file,然后為文件命名。
- 使用 WebSphere Portal 的管理 portlet 來安裝導(dǎo)出的 portlet,然后將其添加到頁中。
- 瀏覽到存有 portlet 的頁。用戶應(yīng)該可以看到類似圖 5 中所示的 portlet。
圖 5. 測試 portlet
- 輸入符號(例如 IBM),然后單擊 Submit。該流程的結(jié)果如圖 6 所示。
圖 6. 查看流程結(jié)果
配置流程模板 利用 portlet 用戶可以配置流程模板的名稱。安裝完 portlet 后,可以使用 WebSphere Portal 中的 Manage Portlets 來更改 Portlet Setting 以指向用戶想要使用的任何模板。此 portlet 既能支持接收輸入消息的簡單數(shù)據(jù)類型又能返回輸出消息的簡單數(shù)據(jù)類型。對于復(fù)雜的數(shù)據(jù)類型,需要對代碼做一點修改。
查看 BPE API Javadoc 用戶可以在 Server Foundation 目錄樹中找到用于 BPE API 的 Javadoc:
<WAS>\web\apidocs\index.html, package com.ibm.bpe.api
結(jié)束語 在本文中您看到了如何創(chuàng)建 portlet 與業(yè)務(wù)流程進(jìn)行交互。您可以使用 Process Choreographer 提供的業(yè)務(wù)流程 Java API 來訪問會話 bean 。
研究一下給定流程模板的輸入清單,您會看到如何使用帶有給定輸入的 API 來實例化業(yè)務(wù)流程。為簡單起見,這里的實例只支持簡單的數(shù)據(jù)類型。現(xiàn)在您可以修改 portlet 以支持復(fù)雜的數(shù)據(jù)類型。
參考資料
下載
|
Name |
|
 |
|
Size |
|
 |
|
Download method |
|
 |
|
0502_gadepalli-PortetProcessCode.zip |
|
 |
|
2467 KB |
|
 |
|
FTP | HTTP |
|
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
作者簡介 Varadarajan Ramamoorthy 是美國 Lotus 公司 IBM Software Services 方面的一位高級顧問。他在位于北卡羅萊納州的羅利 IBM Research Triangle Park Lab 工作。他在 WebSphere Portal 方面有五年多的工作經(jīng)驗,一直與客戶一起創(chuàng)建涉及 WebSphere Portal 方面的解決方案。 |
Vishy Gadepalli 是 Raleigh WebSphere Enablement Team 的成員之一。他在 IT 領(lǐng)域有七年多的工作經(jīng)驗,并且在過去的三年里一直從事客戶預(yù)定涉及 WebSphere Portal Server 等方面的工作。他已經(jīng)撰寫了大量論文,這些論文在 IBM 內(nèi)外廣泛發(fā)表。他還在許多涉及 WebSphere Portal Server 以及 WebSphere Portal Server 如何與其他后端集成的會議上做過演講。 Vishy 同時還是 WebSphere Portal Primer 第一版的合作者之一。
| |