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 月
本文显示了如何创建 portlet 向业务流程提供输入和接收业务流程的输出。用户可以使用 Process Choreographer 提供的业务流程 Java API 来调用业务流程。本文同时包含了可供下载的样本代码。
引言 IBM® WebSphere® Portal V5.1 将业务流程功能集成到门户部署中了。这种支持技术利用 WebSphere Portal (WP) 流程管理接口向很多企业提供了新的用于使用 WebSphere Business Integration Server Foundation (WBISF) Process Choreography 组件的选项。
例如,Process Choreographer 提供了缺省的 Web 客户端,用户可以使用它与为创建中断性或者非中断性的业务流程的任务进行交互。用户可以列出流程模板,输入数据,实例化流程,并与创建为 Staff 和 Receive 活动的用户工作条目一起工作。尽管这种客户端接口有利于在业务活动的部署期间进行测试,但是它并不是用户想要提供给其最终用户的接口类型。
需要为您的用户以 Web 应用程序的方式或者在 WebSphere Portal 中运行 portlet 的方式开发自己的定制用户接口。用户最有可能使用 Process Choreographer 提供的开放 Java™ API(本文中涉及到的 API 均称为 BPE API)与流程引擎进行交互。
本文描述了如何如何使用 Business Process Engine (BPE) API 来创建 portlet 以调用业务流程。为了领会本文的大部分内容,用户需要了解 Process Choreographer、Web 服务、业务流程引擎和 WebSphere Portal。
理解流程的类型 在深入了解实际编写 portlet 的详细资料之前,我们首先看一看流程的两种基本类型:
- 可中断性流程是长时间运行并且由事务服务组成的流程类型。用于批准 loan 应用程序的流程就是这样的一个实例。
- 非中断性流程是短期存活的操作行为,组合起来形成单独的事务操作,信用卡的确认就是一例。
可中断性流程 如果流程的每个步骤都运行在自己的物理事物中,那么该业务流程就是可中断性流程。可中断性流程通常都是长期运行的流程。如果业务流程需要等待外部激励或者包括了用户之间的交互,那么该业务流程就必需是可间断的。外部激励的例子有:
- 在企业对企业的交互中由另一个业务流程发送的事件
- 对异步调用行为的响应
- 完成员工活动
可中断性流程有以下特征:
- 作为一些事务运行
- 由同步服务和异步服务组成
- 通过初始方法或者 sendMessage 方法启动,因为不能同步检索输出消息
- 正常情况下会运行很长的时间
- 能持久地保存运行时值
非中断性流程 非中断性业务流程以单线程的方式运行,从启动到结束期间是不可中断的。非中断性流程也称为 microflows。这些流程有不同的事务能力。它们能够作为活动会话的一部分运行在分布式事务中,或者和本地事务一起运行。
非中断性流程具有以下特征:
- 作为单一事务运行。
- 只由同步服务和非中断性子流程组成。这就意味着非中断性流程不能包括:
- 全体活动或者等待活动
- 异步调用
- 多个接受活动
- 可中断性子流程
- 使用调用方法的方式启动,以便在流程结束后返回输出消息。
- 通常运行时间较短。
- 在数据库中不保存运行时值。
- 不包括中断性流程。
介绍本文的场景 本文的场景是创建了能够通过调用流程来返回存储的参数值的简易 portlet 。为证券报价定义的流程是一个简单的非中断性流程。用户可以查看使用 portlet 调用该流程的步骤。
样本代码 下载中提供了支持该场景的代码。
软件需求 要实现该场景,用户至少拥有一种以下所示的环境:
- 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 的通信机制 在 portlet 和流程之间存在多个通信选择项。
使用 BPE API BPE API 为开发用于基于 Business Process Execution Language (BPEL) 的流程的应用程序提供了以下表现:
- Enterprise JavaBean (EJB) 表现,它能实现 API 的本地或者远程调用。用于每种调用类型(LocalBusinessProcess 接口和 BusinessProcess 接口)的无状态会话 bean 显示了应用程序能调用的函数。BusinessProcessService 接口为这些会话 bean 提供了一种公用接口。
- Java Message Service (JMS) 表现,它使得使用 JMS 能够远程调用 API 函数的子集。
使用 Web 服务客户端 或者,可以将该流程显示为 Web 服务。那么就可以生成用于 Web 服务的 Java 代理,并使用代理实例化流程。
本文将讨论使用 BPE API 和 EJB 调用流程。
准备部署流程 portlet 为部署流程 portlet,需要在 Application Developer 中创建一个项目,并使所需要的库文件可用。
创建 portlet 项目 首先,创建一个 portlet 项目:
- 在 Application Developer 中选择 File => New => Portlet Application Project。
提示: 如果用户在 New 下面看不到 Portlet Application Project,单击 Other,然后选择 Portlet Development => Portlet Application Project。
- 将项目命名为
ProcessStarter ,然后选择 Basic Portlet,如图 1 所示。
图 1. 创建 portlet 项目
- 单击 Next。
- 单击并且确定以下初始化屏幕上的缺省设置,直到用户看到 Event Handling 屏幕。
- 取消 Add Action Listener,然后单击 Finish。
图 2. 完成 portlet 项目的创建
可以看到 Application Developer 中创建的新框架 portlet 项目。
访问所需的库文件 既然已经创建了portlet 项目,还需要使用于调用事务流程 API 的库文件 JAR 可用于 Application Developer。可以通过将以下的 jar 文件从运行流程引擎的 Server Foundation 中复制到该 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
复制这些库文件:
- 打开 Window 浏览器,然后选择这些 jar 文件。
- 单击右键,然后选择 Copy(或者按动 CTRL-C)。
- 在 Application Developer 中,展开然后选择 Portlet Project 文件夹的 WEB-INF\lib。
- 单击右键,然后选择 Paste。
图 3. 将库文件复制到 Application Developer 中
还需要向 portlet 项目的创建路径中添加下列 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,然后退出属性窗口。
现在已经完成了 portlet 项目的设置程序,这样会便于用户开发流程 portal portlet 。
开发 portlet 解压 下载 文件,并且将其内容解压到用户所选的目录中。
将从 zip 文件中解压出的 ProcessStarterPortlet.java 文件中的内容进行复制,并且将其粘贴到 Application Developer 编辑器的 ProccessStarterPortlet 中。
检查提供的代码 接下来查看代码的主要部分以理解 portlet 是如何使用 BPE API 的。
获取业务流程引擎 EJB
portlet 能使用运行在流程服务器上的无状态会话 bean 与流程引擎进行通信。为访问此 EJB,代码在流程机器上执行 JNDI 查询以查找 com/ibm/bpe/api/BusinessProcessHome 来获得 home object 并利用它创建业务流程 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 ();
|
调用流程 API
我们现在来看一下几个关键的 API 。
流程模板是一个经过翻译、部署以及安装的流程模型,它包括业务流程规范。用户可以使用 ProcessTemplateData 来查询流程模板的数据,它能返回很多信息,例如这些信息包括该流程是否是长期运行的流程,还包括它所获得输入消息清单以及输出消息清单等。清单 2 中的代码片断显示了用户如何访问 ProcessTemplateData 对象以及查询输入消息的类型,这些消息正是用户所期望的。 清单 2. 查询 ProcessTemplateData 对象
ProcessTemplateData templateData =
BusinessProcess.getProcessTemplate(templateName);
String inputTypeName =
templateData.getInputMessageTypeName();
|
用户使用 ClientObjectWrapper 在调用者和流程引擎之间封装消息和变量。
当通过 EJB 接口访问流程引擎时:
- 调用参量自动由应用程序服务器反序列化。
- 消息和变量都被反序列化。
ClientObjectWrapper 类将反序列化操作延迟,直到能访问封装的消息或者变量为止,这样流程引擎才能够建立适当的类装载器。
如果用户有包括复杂数据类型的消息,那么必需从该流程中获得包含类的客户端 jar 文件,并将其复制到 portlet 的 WEB-INF/lib 中。 下载 中的代码演示了如何获得这些数据类型。用户得到的类型就是在 XSD 中定义的类型,它们并不是 Java 类型。因此,不能调用 instanceof 来检查数据类型。
封装器包括 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 模型,例如在用户得到了要提交的输入数据清单时就需要如此操作。 清单 4. 访问消息的 WSDL 模型
WSIFMessage inputMessage = … ;
Map inputParts =
inputMessage.getMessageDefinition().getParts();
Iterator partNames = inputParts.keySet().iterator();
while (partNames.hasNext()) {
String partName = (String) partNames.next();
}
|
创建输入 JSP 现在可以开始准备创建用于输入数据的 JSP。
将下载 zip 文件的 ProcessStarterPortletView.jsp 代码内容复制到用户 portlet 项目 jsp/html 目录中的 ProcessStarterPortletView.jsp 中。
ProcessStarterPortletView JSP 将 stock 符号作为输入,并将其发送到 portlet 中处理,如图 6 所示。
创建输出 JSP 接下来需要添加 JSP 来显示 stock 查询。
- 选择 html 文件夹。
- 单击右键,然后选择 New => JSP File。
- 将其命名为 ProcessStarterOutput.jsp,如图 4 所示。
图 4. 创建输出 JSP
- 复制 zip 文件中 ProcessStarterOutput.jsp 的代码,并且将其粘贴到刚刚创建的 JSP 文件中。
显示流程的 PIID 当此代码实例化可中断性流程时,它相应地获得了一个 Process Instance Identifier (PIID)。要显示该 PIID ,需要创建一个 JSP。
- 按照前面章节所述的步骤再创建一个 JSP 文件,命名为 ProcessStarterOutputWSIF.jsp。
- 复制 zip 文件中 ProcessStarterOutputWSIF.jsp 的内容,并且将其粘贴到刚刚创建的 JSP 中。
测试 portlet 下载的文件中还包含另一个 EAR 文件,即 StockProcessSample.ear,它包括运行该流程的应用程序。
测试该 portlet:
- 使用 WebSphere Application Server,如同在 WebSphere Portal 应用服务器中安装单独的企业应用程序一样来安装
StockProcessSample.ear 文件。
- 接下来,在项目上单击右键,然后选择导出,将 portlet 项目作为 WAR 文件从 Application Developer 中导出。
- 在导出屏幕中选择 Export as a war file,然后为文件命名。
- 使用 WebSphere Portal 的管理 portlet 来安装导出的 portlet,然后将其添加到页中。
- 浏览到存有 portlet 的页。用户应该可以看到类似图 5 中所示的 portlet。
图 5. 测试 portlet
- 输入符号(例如 IBM),然后单击 Submit。该流程的结果如图 6 所示。
图 6. 查看流程结果
配置流程模板 利用 portlet 用户可以配置流程模板的名称。安装完 portlet 后,可以使用 WebSphere Portal 中的 Manage Portlets 来更改 Portlet Setting 以指向用户想要使用的任何模板。此 portlet 既能支持接收输入消息的简单数据类型又能返回输出消息的简单数据类型。对于复杂的数据类型,需要对代码做一点修改。
查看 BPE API Javadoc 用户可以在 Server Foundation 目录树中找到用于 BPE API 的 Javadoc:
<WAS>\web\apidocs\index.html, package com.ibm.bpe.api
结束语 在本文中您看到了如何创建 portlet 与业务流程进行交互。您可以使用 Process Choreographer 提供的业务流程 Java API 来访问会话 bean 。
研究一下给定流程模板的输入清单,您会看到如何使用带有给定输入的 API 来实例化业务流程。为简单起见,这里的实例只支持简单的数据类型。现在您可以修改 portlet 以支持复杂的数据类型。
参考资料
下载
|
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 方面有五年多的工作经验,一直与客户一起创建涉及 WebSphere Portal 方面的解决方案。 |
Vishy Gadepalli 是 Raleigh WebSphere Enablement Team 的成员之一。他在 IT 领域有七年多的工作经验,并且在过去的三年里一直从事客户预定涉及 WebSphere Portal Server 等方面的工作。他已经撰写了大量论文,这些论文在 IBM 内外广泛发表。他还在许多涉及 WebSphere Portal Server 以及 WebSphere Portal Server 如何与其他后端集成的会议上做过演讲。 Vishy 同时还是 WebSphere Portal Primer 第一版的合作者之一。
| |