公司需要建模及管理他们的业务流程来将系统及整个企业的人员整合在一起,就像与客户及伙伴联系一样。IBM® WebSphere® 系列产品提供了这些关键能力来帮助公司在任何客户需求、市场机遇或外界威胁下能加快响应速度。
作为 WebSphere 软件平台的基础,WebSphere Application Server 提供了丰富的电子商务应用程序部署环境以及提供了对 J2EE™ 1.3 规范的完全支持。可以使用 WebSphere Application Server Enterprise Edition Process Choreographer 来设计所有类型的业务流程。业务流程的类型可以大不相同,范围可以是从 Web 服务导航到对业务处理的支持。业务流程是自动的且是可恢复的。该产品也可与人交互。
WebSphere Studio Application Developer Integration Edition 为创建、测试、集成、部署 J2EE 应用程序、业务流程及 Web 服务提供了集成的开发环境。使用这个工具,开发者可以从 Process Editor 中对业务流程建模,然后在 WebSphere Test Environment 中对实现进行测试。
WebSphere Portal Server 允许用户以个性化的方式与在要求时的世界进行交互。它作为 Web 应用程序简单的、统一的访问点,允许基于 Web 内容的个性化,并使任何设备都可访问它。
在业务流程部署后,您就可以使用内置的 Business Process Web Client 创建业务流程实例并管理您个人的工作序列项。然而,Business Process Web Client 只是一个测试客户端。如果您想为 Web 客户端添加新的功能或改变其以适应您公司的需要,您可以使用 Business Process Engine (BPE) API。
在本文中,我们将向您展示如何容易的建造、部署、单元测试及管理产品描述批准流程还有创建 Web 应用程序,它将成为业务流程 Web 客户端,该客户端能更进一步的与您公司的门户进行集成。
本文的组织结构如下:第二部分描述业务场景,该场景需要 Human Task 组件的业务流程。第三部分使用 WebSphere Studio Integration Edition 创建业务流程,并使用内建的 Business Process Web Client 对业务流程进行测试。第四部分提供了对 Business Process Web Client API 的总揽,可以使用该 API 开发自定义的 Business Process Web Client。第五部分给出了一个简单的实现。第六部分对整篇文章进行总结。
本文使用 WebSphere Studio Application Developer Integration Edition(开始部分称做 WebSphere Studio)Version 5.1.1 作为业务流程及自定义 Web 客户端的开发工具。本文假设您已经有了在 WebSphere Studio 中如何创建 BPEL 业务流程的知识。您可以参见本文以得到更多的关于如何创建 BPEL 业务流程的信息。
全局数据同步是许多企业面临的挑战之一,特别是当企业有许多 Enterprise Information Systems (EIS) 为不同的业务功能服务时更是如此。例如制造业及销售业。举例来说,如果制造部门生产出新产品,让销售部门能得到有关该产品的信息以能更快的介绍产品是至关重要的。一个典型的场景如下:
制造部门在他们自己的 EIS 中创建了新的产品描述。一旦这个描述进入了 EIS 中,业务流程就会被启动并通知管理部门检查及批准产品描述。一旦该描述被批准,产品描述就会被发送给销售部门的 EIS。
可以在 WebSphere Studio v5.1.1 中创建业务流程。业务流程可以轻易的与 Manufacturing EIS 及 Sales EIS 进行集成。简化了的业务流程的版本展示于图 1 中。我们将在下一个部分中讨论并运行 DescriptionApprovel 业务流程。
图 1. 场景的流程
在这个场景中的 BPEL 业务流程是长期运行的,因为它包含 Staff 动作。 DescriptionApproval 流程实现如下动作:
- 接收产品描述。
- 显示产品描述,如为监控所用。
- 管理者批准产品描述。
- 显示更新后的产品描述。
图 2. DescriptionApproval 业务流程
业务流程的 Web Service Description Language(WSDL)文件显示如下。它有类型为
DescriptionApprovalRequest 的输入消息。端口类型是
DescriptionApprovalPT,操作是
approve。
清单 1
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="DescriptionApprovalClient"
targetNamespace="http://exchange.ibm.com/DescriptionApprovalClient"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="http://exchange.ibm.com/DescriptionApprovalClient"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<message name="DescriptionApprovalRequest">
<part name="id" type="xsd:string"></part>
<part name="description" type="xsd:string"></part>
</message>
<portType name="DescriptionApprovalPT">
<operation name="approve">
<input message="tns:DescriptionApprovalRequest"></input>
</operation>
</portType>
</definitions>
|
“staff”动作(ManagerApproval)的 WSDL 文件显示如下。WSDL 文件为
ManagerApproval“staff”动作定义了端口类型、操作、输入及输出消息。
清单 2
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="ManagerApproval"
targetNamespace="http://exchange.ibm.com/ManagerApproval"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="http://exchange.ibm.com/ManagerApproval"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<message name="ManagerApprovalRequest">
<part name="id" type="xsd:string"></part>
<part name="description" type="xsd:string"></part>
</message>
<message name="ManagerApprovalResponse">
<part name="result" type="xsd:string"></part>
<part name="description" type="xsd:string"></part>
</message>
<portType name="ManagerApprovalPT">
<operation name="approve">
<input message="tns:ManagerApprovalRequest"></input>
<output message="tns:ManagerApprovalResponse"></output>
</operation>
</portType>
</definitions>
|
在“staff”动作的属性页中定义了角色信息。为简化该演示的目的,这个动作的 Potential Owner 是 Everybody,如图 3 所示。在实际的应用当中,所有者应当是某些特定的组或用户。
图 3. “staff”动作的属性
导入简单的 BPEL 应用程序
- 在 这里下载简单的文件。
- 将 PrivateExchange.zip 解压到您的工作区中。
- 从工作台中创建名为
PrivateExchange的服务工程(Service Project)。它会从工作区的文件夹中获得已有的文件。
下一步是部署业务流程。右键单击 DescriptionApproval.bpel => Enterprise Services => Generate Deploy Code。由于我们要使用 BPE API 演示业务流程,因此我们不需要任何接口绑定,而不像图 4 中显示的要绑定 JMS。这步中将创建 EAR、EJB 及 Web 工程。
图 4. 生成部署代码
在我们部署完流程后,我们可以创建服务器实例、配置并将部署的工程添加到服务器配置中。这个流程是长期运行的流程,我们需要在服务器上右键点击来创建表和数据源。服务器启动之后,开始业务流程 Web 客户端。
Web 客户端提供了三个主要的业务功能——启动业务流程实例、工作列表项及管理。除管理员外的末端用户将会只对前两个功能感兴趣。
- 从导航树种选择 Process Template List => My Templates。
- 选择 DescriptionApproval 模板,然后选择 Start Instance。
- 填入输入消息。如描述中填入:ThinkPad T21,id 中填入:TP-T21。您可以不填写 Process Instance Name,因为服务器将会创建一个。
- 点击 Start Instance 按钮来创建 BPEL 流程的新实例。
图 5. BPE Web 客户端
在业务流程实例启动之后浏览器会自动切换到 My To Dos 页面。
查看控制台视图,您会发现
DisplayProductDescription Java 代码片断的系统输出。
========= Approval Required ========== id:TP-T21 description:ThinkPad T21 ====================================== |
在业务流程启动之后,您会在 My To Dos 页面中看到新的工作项。如果您没有看到该工作项,点击导航条上的 My To Dos 刷新页面。
图 6. BPE Web 客户端——工作项
选择 ManagerApproval 动作,然后从 Available Actions 列表中点击 Claim 按钮。ManagerAppoval 工作项的状态就会变成 Claimed。
再选择
ManagerApproval 动作,然后从 Available Action 列表中选择
Complete。就会显示动作的输入及输出消息,如图 7 所示。这些消息都是来源于
ManagerApproval.wsdl。
从 Available Actions 列表中选择 Complete 来完成工作项。
图 7. BPE Web 客户端——工作项声明页
在控制台中您将看到如下输出。管理者可以修改或保存产品描述。
========= Manager Approval ========== Result:Approve Updated Description: ThinkPad T21 ====================================== |
在接下来的部分中,我们将创建自定义 Web 客户端,该客户端可以为 BPEL 流程创建新实例并提供自定义的界面来管理工作项。
这个业务场景的自定义 Web 客户端的业务需求包括:
- 启动流程
- 取得个人工作列表
- 显示工作项的输入
- 声明工作项
- 完成工作项
在这部分中我们将查看 Business Process API 并讨论创建 Web 客户端的步骤。
BusinessProcessService API 是可以通过 Process Choreographer 组件的 SessionBean 正面(facade)得到的一套方法,它允许您使用程序与 Process Choreographer 组件交互,例如启动流程、取得工作列表、声明/完成工作项。内建的 Business Process Web Client 就是使用这个 API 实现的。在本文中,您将使用这个 API 创建您自己自定义的 Web 客户端。
Web 客户端使用 Servlet 和 JSP 来实现,这需要调用相应的 BPE API。由 BPE API 提供的 BusinessProcessService 会话 bean 被用来访问及操作 BPEL 流程。必须在 Web Deployment Descriptor (
web.xml)中注册 Enterprise JavaBeans(EJB)引用,应用程序才能使用它。
您可以根据接下来的文章创建 Web 客户端,或下载代码。
为自定义 Web 客户端导入代码
- 在 这里下载简单文件。
- 从工作台中选择,
File => Import => WAR file。点击
Next。选择
PrivateExchangeWeb.war作为文件名,然后选择PrivateExchangeWeb作为工程名。点击 Finish。当提示是否覆盖现有文件时点击 Yes。
为使用 BusinessProcessService 会话 bean,要向 PrivateExchangeWeb 工程的 lib 文件夹中导入两个 jar 文件—— bpeapi.jar 及 bpe137650.jar。您可以从 \runtimes\ee v5 stub\lib 中找到这些文件。
接下来,打开 Web 应用程序的
Web Deployment Descriptor。在本例中是
PrivateExchangeWeb 工程的 web.xml 文件。在 Reference 选项卡中为 EJB 引用添加新的入口,添加信息如图 8 所示。
| Name: | ejb/BusinessProcess |
| Type: | Session |
| Home: | com.ibm.bpe.api.BusinessProcessHome |
| Remote: | com.ibm.bpe.api.BusinessProcess |
| JNDI Name: | com/ibm/bpe/api/BusinessProcessHome |
图 8. Web 部署描述符——EJB 引用
下面
StartProcessServlet 的代码片断简单的演示了如何启动业务流程实例。
代码样本 1 - 启动业务流程实例
String template = "DescriptionApproval";
String id = req.getParameter("id");
String description = req.getParameter("description");
BusinessProcessHome processHome;
BusinessProcess process;
String instance = template + (new java.util.Date()).toString();
javax.naming.InitialContext context = new javax.naming.InitialContext();
// Lookup the home interface of the BusinessProcess bean
Object result = context.lookup("java:comp/env/ejb/BusinessProcess");
// Convert the lookup result to the proper type
processHome = (BusinessProcessHome) javax.rmi.PortableRemoteObject.narrow(
result,
BusinessProcessHome.class);
process = processHome.create();
// construct the input message for the process.
ProcessTemplateData processTemplate = process.getProcessTemplate(template);
ClientObjectWrapper inputMsg = process.createMessage(
processTemplate.getID(),
processTemplate.getInputMessageTypeName());
WSIFDefaultMessage input = (WSIFDefaultMessage) inputMsg.getObject();
input.setObjectPart("id", id);
input.setObjectPart("description", description);
process.initiate(template, instance, inputMsg);
Thread.sleep(2000);
getServletContext().getRequestDispatcher("RetrieveWorkListServlet").forward(req,resp);
|
在我们的样本中,接下来的
RetrieveWorkListServlet 代码片断演示了如何取得个人工作列表。
代码样本 2 - 取得个人工作列表
Vector worklist = new Vector();
BusinessProcessHome processHome;
BusinessProcess process;
String wlname = "MyActivities";
javax.naming.InitialContext context = new javax.naming.InitialContext();
// Lookup the home interface of the BusinessProcess bean
Object obj = context.lookup("java:comp/env/ejb/BusinessProcess");
// Convert the lookup result to the proper type
processHome = (BusinessProcessHome) javax.rmi.PortableRemoteObject.narrow(
obj, BusinessProcessHome.class);
process = processHome.create();
String s =
"DISTINCT ACTIVITY.AIID, ACTIVITY.TEMPLATE NAME, ACTIVITY.STATE,
ACTIVITY.OWNER, WORK ITEM.REASON, ACTIVITY.ACTIVATED, PROCESS INSTANCE.NAME,
PROCESS INSTANCE.TEMPLATE NAME, PROCESS INSTANCE.PIID";
String s1 =
"ACTIVITY.STATE IN (2, 8) AND WORK ITEM.REASON IN (1, 4, 2, 3) AND
PROCESS INSTANCE.STATE = 2";
QueryResultSet result = process.query(s, s1, null, null, null);
// store the results
if (result.size() != 0) {
result.first();
for (int counter = 0; counter < result.size(); counter++) {
WorkListResult entry = new WorkListResult();
entry.setAiid(result.getOID(1).toString());
entry.setTemplateName(result.getString(2));
entry.setState(result.getInteger(3).toString());
entry.setInstanceName(result.getString(8));
worklist.add(entry);
System.out.println(entry);
result.next();
}
}
req.getSession().setAttribute("worklist", worklist);
getServletContext().getRequestDispatcher("MyWorkList.jsp").forward(req,resp);
|
在我们的样本中,接下来的
GetWorkItemServlet 代码片断演示了如何显示工作列表的输入信息。
代码样本 3 - 显示工作列表的输入消息
BusinessProcessHome processHome;
BusinessProcess process;
javax.naming.InitialContext context = new javax.naming.InitialContext();
//Lookup the home interface of the BusinessProcess bean
Object obj = context.lookup("java:comp/env/ejb/BusinessProcess");
//Convert the lookup result to the proper type
processHome = (BusinessProcessHome) javax.rmi.PortableRemoteObject.narrow(
obj,
BusinessProcessHome.class);
process = processHome.create();
String aiid = req.getParameter("aiid");
ClientObjectWrapper input = process.getInputMessage(aiid);
WSIFDefaultMessage inputMsg =(WSIFDefaultMessage) input.getObject();
req.setAttribute("id",(String) inputMsg.getObjectPart("id"));
req.setAttribute("description", (String) inputMsg.getObjectPart("description"));
getServletContext().getRequestDispatcher("ShowWorkItem.jsp").forward(req,resp);
|
在我们的样本中,接下来的
ExecuteActivityServlet 代码片断演示了如何声明及完成工作项。
代码样本 4 - 声明及完成工作项
BusinessProcessHome processHome;
BusinessProcess process;
javax.naming.InitialContext context = new javax.naming.InitialContext();
//Lookup the home interface of the BusinessProcess bean
Object obj = context.lookup("java:comp/env/ejb/BusinessProcess");
//Convert the lookup result to the proper type
processHome =(BusinessProcessHome) javax.rmi.PortableRemoteObject.narrow(
obj, BusinessProcessHome.class);
process = processHome.create();
String aiid = req.getParameter("aiid");
process.claim(aiid);
WSIFDefaultMessage outputMsg = (WSIFDefaultMessage)process.createMessage(
process.getActivityInstance(aiid).getProcessTemplateID(),
process.getActivityInstance(aiid).getOutputMessageTypeName()).getObject();
outputMsg.setObjectPart("result", req.getParameter("result"));
outputMsg.setObjectPart("description", req.getParameter("updatedDesc"));
process.setOutputMessage(aiid, new ClientObjectWrapper(outputMsg));
process.complete (aiid);
getServletContext().getRequestDispatcher("RetrieveWorkListServlet").forward(req,resp);
|
Web 客户端需要在一定的安全原则下执行,为的是能取得个人工作列表及完成工作项。作为结果,Web 工程就需要身份验证及授权。按照如下步骤改变安全角色。
- 打开 Web Deployment Descriptor。
- 选择编辑器底部的
Security 选项卡。您将会首先看到位于编辑器顶部的 Security Roles 选项卡。创建名为
BPEUser的安全角色。 - 点击位于编辑器顶部的 Security Constraints 选项卡。使用 URL 模式 /* 创建 Web Resource Collection,名称任意。这意味着在 Web 工程中的所有 Servlet and JSP 都是安全的了。
- 创建 Web Resource Collection 之后,选择 BPEUser 作为授权角色。
- 保存 Web Deployment Descriptor。
- 打开
Application Deployment Descriptor。在这里是
PrivateExchangeEAR工程中的 application.xml 文件。 - 选择编辑器底部的 Security 标签。
- 点击 Gather... 按钮来收集在所有 Web 及 EJB 模块中定义的安全角色。在这里 BPEUser 将显示在列表中。
- 从列表中选择 BPEUser,然后选择 All,验证用户作为绑定。
- 保存 Application Deployment Descriptor。
图 9. Web 资源集合
图 10. 应用程序部署描述符
- 如果服务器正在运行,那么将其停止。
- 在编辑器中打开 Server Configuration。选择 Security 选项卡,然后为服务器启动安全性。
- 在 Server ID 字段内输入用户 id,在 Server password 字段中输入您的密码。如果您在 Windows 本机上运行服务器,您可以使用 Windows 的登陆 id 和密码。
图 11. 服务器配置
- 启动服务器。
-
Right-click on the
main.htmlunderPrivateExchagneWebproject, and select Run on Server. - 输入您的用户名和密码,您将会进入应用程序的主页面。
图 12. mail.html
输入我们在内建的 Business Process Web Client 中定义的输入消息,如 TP-T21 作为 Id, Thinkpad T21 作为描述,然后点击 Submit。
查看服务器控制台,您会发现如下的消息:
========= Approval Required ==========
id:TP-T21
description:ThinkPad T21
======================================
|
在启动业务流程实例之后,My To Dos 页面将显示出来。这个页面显示由
DescriptionApproval 业务流程创建的工作项。
图 13. My To Do
选择 ManagerApproval 链接,您将看到这个动作的输入消息:id 及 描述。另外,更新后的描述也随原描述一起出现。您可以在 Update Description 文本框中更新描述。输入一些输出消息,然后点击 Submit。
图 14. 工作项批准页
您将会看到工作台中有如下的信息:
========= Manager Approval ==========
Result:Approved
Updated Description: ThinkPad T21 (SALE)
======================================
|
WebSphere Studio Application Developer Integration Edition 有内建的 Business Process Web Client,用户可以使用它来管理业务流程及完成工作项。在某些情况下,需要自定义的 Web 客户端,如添加主题、为特定业务流程缩减 Web 客户端或创建 portlet,并将其部署在公司的门户上。开发者总是可以使用 BusinessProcessService API 开发他们自己的应用程序,就像本文中开发的样本应用程序一样。
| 名字 | 大小 | 下载方法 |
|---|---|---|
| PrivateExchange.zip | 12 KB | HTTP |
- 您可以参阅本文在 developerWorks 全球站点上的
英文原文。
-
Business Process Service
- 要学习有关 WebSphere Application Server 的知识,请访问
developerWorks WebSphere Application Server 社区。您会找到技术文档、指引的文章、训练、下载、产品信息、技术支持资源等等。
- 加入
developerWorks blogs 参加 developerWorks 社区。
- 寻找
WebSphere 折扣价书籍
Jane Fung 在 WebSphere Studio Application Developer Integration Edition 工具组工作。Jane 获得了位于加拿大安大略省的 Waterloo 大学的电气工程应用科学学士学位。他是 Sun Java 2 认证程序员。您可以通过 jcyfung@ca.ibm.com 与 Jane 联系。
Colin Yu 是 IBM 多伦多实验室的一名 WebSphere Studio Application Developer 软件开发人员。Colin 于 1995 年获得工程学士学位并于 2000 年获得 Waterloo,Ontario 大学的应用科学硕士学位。Colin 是一位 WebSphere Application Server 方面的 IBM Certified Enterprise Developer 和系统专家(Systems Expert),同时还是一位 WebSphere Studio Application Developer 和 VisualAge for Java 方面 IBM 认证的解决方案开发人员。您可以通过 coliny@ca.ibm.com 与 Colin 联系。