在本系列文章的第一部分中,我们介绍了一个用于制造业订单处理系统(Order to Manufacturing Processing System,OTMPS)的业务流程场景。这篇文章描述了怎样使用人员活动在流程中加入人为干预。人员活动是流程中的一个步骤,一般通过与某个人的交互来手动地执行。这个交互通常是通过使用客户端用户接口来实现,比如运行在浏览器中的 Web 客户端。人员活动通过工作条目被分配给组织中的每个人。当调用一个人员活动的时候,工作条目就会为潜在的拥有者创建。这些人中的某一个稍后将会认领这个活动,并且对其负责,提供相关信息并且确保活动的完成。
WebSphere Business Integration Server Foundation Process Choreographer 中的人员活动分析
如图 1 所示,人员解析(staff resolution)包含的主要组件是 Web 客户端、流程编排(Process Choreographer)引擎、工作条目管理器、员工支持服务、人员解析插件以及员工存储库。
图 1. WebSphere Business Integration Server Foundation 流程编排中的人员活动分析
Web 客户端是基于 JSP 技术来实现的。它为用户提供了一个包含工作条目的工作列表集合,在这些工作条目上可以执行查询以及查看进一步的详细信息或者执行其他某些动作。每个工作条目呈现一个过程实例、一个活动或者一个事件,通过这些事件用户可以执行某些动作。这些条目的潜在拥有者可以认领或者完成该任务。Web 客户端通过过程 API 同流程编排引擎进行交互。
流程编排引擎负责控制过程实例和这些过程实例中的活动的状态转换。
工作条目管理器负责创建和删除工作条目,执行工作条目查询,并且调用员工支持服务来加强认证。
员工支持服务控制了对人员解析插件的访问以及将员工查询动作转换为插件指定的查询,并且也负责把人员解析请求委派到这些专有插件。
人员解析插件特定用于不同的存储库,比如轻量级目录访问协议(Lightweight Directory Access Protocol,LDAP)目录或者用户注册中心。它们从外部的员工存储库中获取信息并且执行员工查询。关于人员解析架构的更多信息,请参考参考资料中的“Staff Resolution Architecture”。
在本系列文章的第五部分中,我们举例说明了如何向流程中添加错误控制器。在这部分中,我们描述了一个在错误控制器中使用人员活动的例子。
在 OTMPS 场景中,我们为 Validate & Generate Topology 活动添加了一个错误控制器来捕捉活动中生成的错误。当该活动中出现任何异常的时候,流程会进入到错误控制器中,以便进行人为干预。系统为潜在的用户会生成一个工作条目 -- 例如,为用户“Joe”生产一个工作条目,而且他为“Administrator”角色。稍后,当 Joe 登录到过流程 Web 客户端,他将在他的“My To Dos”列表下面看到相应的工作条目。
通过用户接口,Joe 可以看到流程中的输入和流程中错误的细节。这时他可以对处理流程作出决定 -- 重新启动或者终止流程。例如,如果错误信息告诉 Joe 不能连接到配置服务,Joe 可以打电话给配置服务人员以找到问题的根源并确认服务何时可用。如果问题可以被解决并且服务又可以使用,Joe 可以决定重新启动 订单处理流程。但是如果错误是致命的并且 Joe 不能修复这个错误,他可能决定结束该流程并且通知支持团队。在 Joe 输入响应以后,响应信息会发送回流程。流程将根据他的响应执行一个流程路径以完成该工作条目。
人员活动是在流程中需要人为干预的时候被引入。一个人员活动组件提供一个或者更多的操作,这些操作与输入和输出消息有关并且通过恰当的用户接口实现同人员的交互。在下面的章节中,我们描述了一个方法——向一个错误控制器流程中添加一个人员活动。所需的步骤为:
首先,您需要使用恰当的操作为人员活动定义一个接口。这些操作定义人员活动的输入和输出消息。
为了创建一个Web 服务定义语言(Web Service Definition Language,WSDL)接口文件,您既可以使用 WebSphere Studio Application Developer 集成版提供的工具直接从 WSDL 向导生成,或者从一个已存在的 Java 类来构建。为了从一个 Java 类中创建 WSDL 接口文件,该 Java 类需要包括有适当输入参数的方法。该方法可以不需要具体的实现。例如,清单 1 中的 Java 类。
清单 1. ExceptionHandler Java 类
package Process.ExceptionHandler;
public class StaffActivity {
public boolean staffAction(ExceptionInput input)
{
return true;
}
}
|
接下来通过选择 WebSphere Studio Application Developer 集成版的 Service build from 功能,您将从这个 Java 类生成一个新的 WSDL 文件。在接下来的 Create Service 界面,选择 Java 模板来构建新的服务。在 Select Methods 界面,您只需要选择您想要作为服务操作的方法即可。
除了 WSDL 接口文件 StaffActivity.wsdl,绑定文件 StaffActivityJavaBinding.wsdl 及服务文件 StaffActivityJavaService.wsdl 也被自动生成,因为绑定和服务文件在我们这里并不需要,您可以删除这两个文件。
图 2 显示了有服务操作和相关消息的人员活动端口类型(Port Type)。
图 2. 人员活动的 Port Type
包含人员活动的流程必须是一个宏观流(macroflow)。如图 3 所示,通过从 业务流程执行语言(Business Process Execution Language ,BPEL) 编辑器面板中选择 Staff 图标将人员活动添加到 ExceptionHandler 类中。在人员活动的应用窗口,点击 Browse 并且选择您上一步创建的接口。使用 Port Type 和 Operation 下拉列表框类选择端口类型和相应的操作。通过点击 New 按钮为人员活动创建新的请求和响应变量。它被链接到 PortType“StaffActivity”和操作“staffAction”。并且生成了变量 StaffIn 和 staffOut。
图 3. 添加人员活动
人员活动使用的输入数据同流程输入数据可能不同。所以我们需要一个 Java 代码片断,用来在人员活动中将输入数据映射为 staffIn 数据。
您应该在流程中添加额外的逻辑 -- 例如,人员活动返回后做什么?在 OTMPS 场景中,在人员活动返回后有两个执行路径,如图 4 所示。如果员工对于异常的答案是终止进程,一个 Java 片断通知支持组并且一个 BPEL“Terminate”活动将被执行来停止该流程。如果员工的答案是重新启动流程,一个 Java 片断将被执行用来映射数据,并且 OrderProcessSystem 流程将被重新调用。您也可以在 Java 片断中实现这些方法或通过调用其它服务。
图 4. 在人员活动中添加返回后逻辑
上面的人员活动操作(staffAction)被组织中不同角色的人执行。一个人员活动任务被指派给一个角色。您可以使用动词来指定与预定义的角色相关联的人员。图 5 显示了上面人员活动的属性表,包含可能的角色和动作。
Process Editor 定义了角色,例如“Potential Owner”、“Editor”、“Reader”或者“Administrators”。Process Editor 在文件 VerbSet.xml 中提供了预定义的人员查询动词。这些动词(例如,userID、users by User ID、everybody)是参数化的抽象查询模板,它们然后可以用来定义针对某种人员信息存储库(比如 LDAP 用户注册表) 的具体人员查询。在部署的时候,这些动词被转换成特定存储库的查询。例如,WebSphere Business Integration Server Foundation 流程编排中定义的动词被转换为特定 LDAP 的查询。关于动词、查询和查询转换的更多信息,请参阅参考资料中的“Staff Resolution Parameter Reference”。
人员通过人员查询的方式被指派到人员活动。在 OTMPS 场景中,我们指定了带“Potential Owner”角色的人员查询,以及使用“Users by user ID”动词来把成员关联到这个角色。“Users by user ID”动词允许您定义许多查询参数,比如 user ID(例如,Joe)。虽然不推荐硬编码用户名作为参数,不过这个动词在与上下文查询结合后还是非常有用的。如图 5 所示,我们将参数“UserID”设定为 %wf:process.starter%。
LDAP 和用户注册表都支持动词“Users by user ID”。我们使用 WebSphere 用户注册表作为用户(例如,Joe 和 Sam)和组(例如,administrators,users 和 staff)的人员存储库。(参阅参考资料以获取关于 WebSphere 用户注册表更多信息的链接。
运行时的潜在所有者(例如,OTMPS 管理员)可以认领人员活动并且在它上面工作,然后变成活动的所有者并且最后完成它。当为人员活动创建了工作条目后,那也为“Users by user ID”动词确定的人创建了工作条目。特别是,将为启动当前流程实例的用户生成工作条目。这个用户信息将从用户注册中心中获得。例如,如果“Joe”启动流程,他的详细信息(例如姓名、相关角色和信任状)将从 WebSphere 用户注册中心中获得并且为他创建工作条目。
当您把流程部署到生产环境时,您可能想要使用另一个注册表解决方案。
图 5. 人员角色和动词
任何时候当您想让您的流程能与外部用户通信,您都可以使用流程编辑器的客户端能力来达到。例如,假设一个员工通过流程的人员活动任务被指派了工作条目。您可以使用默认的流程 Web 客户端并且将任务交付给它。
默认的流程 Web 客户端仅仅是为了测试,并且作为一个功能性的例子来作为定制的起始点。对于定制的用户接口外观(Look and Feel,LaF),请编写自定义的 Web 客户端或者自定义应用程序。
在人员活动属性表中的 Client 属性中,如图 6 所示,您可以定义想要用来同员工交互的 JSP 页面。这些 JSP 被嵌入到流程 Web 客户端。您也可以使用 WebSphere Portal 作为客户端接口来管理任务。为了将流程集中到 Portal 中,使用 Portal 设置来为这个任务指定唯一的客户机 UI 标识符。Portal 服务器将使用这个标识符来查询任务页面定义。
图 6. 为人员活动添加用户接口页面
为了编写自定义的应用程序来处理工作条目和流程生命周期事件(例如,流程启动和流程停止),您可以使用流程编排 API 来同流程进行交互。清单 2 包含了一个例子,显示了如何使用流程 API,为一个以“Administrator”角色登录到 Web 客户端的用户“Joe” 获取一个个人工作列表。
清单 2. 使用流程 API 的查询工作条目
import com.ibm.bpe.api.*;
...
InitialContext initialContext = new InitialContext(...);
// lookup the EJB home interface
Object object = initialContext.lookup("com/ibm/bpe/api/BusinessProcessHome");
BusinessProcessHome processHome = (BusinessProcessHome)
javax.rmi.PortableRemoteObject.narrow(object, BusinessProcessHome.class);
// get the remote interface
BusinessProcess process = processHome.create();
// run a query to show all activity names that are ready to be started
// and that I can claim (where I have a potential owner work item)
QueryResultSet resultSet = process.query(
// select clause - what do we want to get?
"PROCESS_INSTANCE.NAME, ACTIVITY.TEMPLATE_NAME",
// where clause - what are the qualifying rows?
"WORK_ITEM.REASON=WORK_ITEM.REASON.REASON_POTENTIAL_OWNER AND " +
"ACTIVITY.STATE = ACTIVITY.STATE.STATE_READY",
// order clause - specify the sort order
"PROCESS_INSTANCE.NAME",
// threshold - return first 10 entries only
new Integer(10),
// no timezone specified
null
);
// loop over results in the result set
while( resultSet.next() )
{
// print out selected columns, keep in mind column indexes start with "1"
System.out.println( "Process instance name = " + resultSet.getString(1) );
System.out.println( "Activity template name = " + resultSet.getString(2)
);
}
|
关于开发自定义 Web 客户端的细节,请参考列在参考资料中的文章"使用 WebSphere Studio Integration Edition 为 Business Process Choreographer 开发自定义 Web 客户端"。
因为 WebSphere Business Integration Server Foundation 流程编排将人员解析委派给插件,因而您可以使用多种类型的企业目录。人员解析插件负责处理从外部子系统中获取员工信息(例如,LDAP 目录)。流程编排引擎支持的供应商列表包含用户注册表、LDAP、系统注册表。
在 OTMPS 中,我们使用 WebSphere 用户注册表来存储与系统交互的用户和组的信息。我们通过用户注册表人员插件提供者与 WebSphere 用户注册表连接,进行配置。这个提供者使用 WebSphere Application Server 所知的用户和组,并且需要启用 WebSphere 全局安全。如图 7 所示,这个人员插件配置包含到 XML 转换文件的一个引用,该文件用来将流程编排人员查询动词转换为用户注册中心提供者特定的查询。对于我们的场景,我们使用流程编排提供的默认转换脚本。通过在服务器配置窗口中选择 Staff tab 我们可以配置这些人员插件提供者。
图 7. 更新人员插件配置
在 BPEL 部署代码生成时,为应用程序部署时使用的人员插件配置选择正确的 JNDI 名。如图 8 所示,我们选择 bpe/staff/userregistryconfiguration 作为 JNDI 名。这是您在第五步中为人员插件配置定义的 JNDI 名。当 EAR 被部署时,人员支持服务将使用这个 JNDI 名来定位人员插件配置,并且调用相应的本地提供者 API。
图 8. 生成 BPEL 部署代码
在运行时,当到达人员活动时,流程编排引擎创建工作条目,这些工作条目可以被任何潜在的工作条目所有者来认领。工作条目的潜在所有者将登录到默认的流程 Web 客户端,并且将看到同图 9 类似的窗口。
图 9. My To Dos 窗口
一旦符合条件的所有者声明了工作条目,请求变量和它的内容就显示给这个人。这个人通过为相应变量输入数据并把变量传递回流程来完成工作。图 10 显示了默认的用户接口。
图 10. 执行人员活动窗口
本文描述了 WebSphere Business Integration Server Foundation 中的人员活动,并且给出了在 OTMPS 场景中的使用示例。它一步步地举例说明了如何向工作流中添加人员活动,以及工作条目如何被流程创建和被流程客户端获取。另外,我们还描述了用户角色、用户注册表和人员解析组件之间的关系。
- 阅读随需应变的业务流程生命周期的所有部分,并且随时注意新的文章。
- 阅读这些文章和信息中心,查看关于 Process Choreographer 的更多信息:
- “WebSphere 中的业务流程策划:联合 BPEL 和 J2EE 的力量”
- “Websphere Application Server 信息中心”
- “Staff Resolution Architecture”
- “Staff Resolution Parameter Reference”
- “工作条目和 query() API 调用”
- “用于人员解析的 WebSphere Application Server 企业流程编排器编程模型”
- “使用 WebSphere Studio Integration Edition 为 Business Process Choreographer 开发自定义客户端”
- “WebSphere 用户注册表”
- 从 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 获取您所需的开发工具和中间件。您可以免费下载这些产品的评估版本,或者选择 developerWorks 免费的 Linux® 或者 Windows® 版本的 Software Evaluation Kit。
- 访问 Developer Bookstore,获取技术书籍的完整列表,包含数百本 Web 服务标题的书籍。
- 通过参与 developerWorks blogs 加入到 developerWorks 社区。
- IBM developerWorks 团队有很多技术讲座,您可以免费申请参加。
- 想要更多信息?IBM developerWorks SOA 和 Web 服务专区有数百篇关于开发 Web 服务应用程序的有见地的文章和入门级、中级和高级的培训资料。
Wei Liu 是来自 IBM Software Group 的一位软件工程师。目前,她在 IBM On Demand 开发团队工作。她擅长的领域包括 WebSphere 应用服务器、Web 服务和工作流开发。您可以通过 liuwei@us.ibm.com 与她联系。