中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> IBM专区 > WebSphere > WebSphere综合
使用 Business Process Choreographer API 通过 WebSphere Process Server V6 创建业务流程 Portlet 应用程…
作者:Sean (Chunhong) Gu 时间:2006-08-27 03:04 出处:IBM 责编:月夜寒箫
              摘要:使用 Business Process Choreographer API 通过 WebSphere Process Server V6 创建业务流程 Portlet 应用程序
本文向您介绍如何使用 WebSphere Business Process Choreographer API 将门户应用程序与 IBM WebSphere Process Server V6 相集成。本文主要面向 Portlet 开发人员、业务流程和门户集成专家和架构师。可下载的示例代码包括最常用的功能,以帮助您获得入门知识。您应该对 Business Process Execution Language、WebSphere Business Process Choreographer、WebSphere Portal 和 Rational Application Developer 有基本的了解。此外,当您在示例实现中使用基于角色的人员分配时,您应具备 Lightweight Directory Access Protocol (LDAP) 和 Java 2 Platform Enterprise Edition (J2EE) 安全方面的基础知识。

引言

目前,门户集成逐渐成为许多面向服务的体系结构 (SOA) 应用程序不可或缺的部分。迷人的图形用户界面 (GUI) 加上固有的 Portal 功能大大增加了业务流程应用程序的价值,特别是需要人工交互的长时间运行的流程应用程序。本文将使用基于 Business Process Choreographer (BPC) 编程模型(属于 IBM® WebSphere® Process Server V6 的一部分)的 API 向您详细介绍流程 Portlet 应用程序。

本文还将向您介绍如何配置门户组件(包括安全性),以及如何将其与业务流程引擎集成。示例 Portlet 和配置可帮助您开发完整的流程门户应用程序。通过门户和流程服务器之间使用 BPC API 的编程式集成,您可以使用完全自定义的选项来构建高度灵活的有效流程门户解决方案。

示例方案

我们创建了一个示例方案(图 1)来帮助您方便地集成流程 Portlet 应用程序。带有人工任务活动的简单业务流程用于演示门户和流程服务器之间的人工交互。简单的订单业务流程 SimpleOrderProcess (2) 和客户服务人工任务 CustomerService (3) 被表示为 BPC 支持的两种类型的 SCA 组件。流程启动程序从 Order Initiator Portlet (1) 初始化业务流程,并且通过 Customer Service Portlet (5) 处理人工任务。当启用安全性时,将根据“人工任务”设置从 Staff Plugin (4) 分配适当的角色。

在我们的场景中,人工任务 Portlet 会访问作为“Standalone Task”(人工任务组件)的 Participating Human Task。不过,代码示例还适用于“Inline Task”(在业务流程内定义)。通常,如果业务流程作为任务上下文的一部分,则使用“Inline Task”,但是当在不同的解决方案中重用时,将选择打包为服务组件的“Standalone Task”。

此方案中使用的流程集成在门户和流程服务器之间是松散耦合的。


图 1. 示例方案
示例方案

环境要求

使用 WebSphere Portal V5.1.0 通过 WebSphere Process Server Version 6 创建并测试示例方案。建议您在 WebSphere Process Server V6.0.1 上使用支持的 WebSphere Portal V5.1.0.3。

使用 WebSphere Process Server V6 需要以下环境设置:

重要:确保在流程服务器的 WPSlib 中包括 task137650.jar 和 bpe137650.jar,因为 137650 jar 文件包含远程 EJB 访问所需的 Enterprise JavaBean (EJB) 存根。

  1. 转到 WebSphere Process Server Admin Console,并选择 Environment => Shared Libraries
  2. 单击 WPSlib 链接。
  3. 包括 Classpath 中的两个 jar 路径,然后单击 OK
  4. 重新启动服务器。

使用 BPC API 部署流程 Portlet

本部分介绍 BPC API,并向您展示两个 Portlet,它们分别使用 Business Flow Manager API 和 Human Task Manager API 与业务流程和人工任务交互。

BPC API 概述

WebSphere Process Server V6 为业务流程和人工任务提供了多个接口。它包括 Service Component Architecture (SCA) 编程模型、WebSphere 管理模型以及 Java™ 2 Enterprise Edition (J2EE) 和 Java 编程模型。对于外部客户端访问,可以使用 SCA 接口或 BPC 接口。在 SCA 编程模型中,客户端使用 SCA 服务管理器来查找服务、创建与服务交换的数据对象、调用服务上的方法,并最终处理从服务(BPC 编程模型)返回的输出和异常。

本文使用一般的 BPC EJB API 与业务流程和人工任务交互。实际上,有两组单独的 API:Business Flow Manager 和 Human Task Manager。

可以通过远程或本地 EJB 接口访问 Business Flow Manager EJB API:

  • BusinessFlowManager 提供的远程 Enterprise JavaBeans (EJB) 接口。
  • LocalBusinessFlowManager 提供的本地 EJB 接口。

也可以使用以下接口将 Human Task Manager API 实现为企业 bean,这些接口在概念上提供相同的 API 功能:

  • HumanTaskManager 提供的远程 EJB 接口。
  • LocalHumanTaskManager 提供的本地 EJB 接口。
  • HumanTaskManagerDelegate 为从本地或远程接口抽象的客户端提供的接口(BPC 编程模式)。

本文中的示例实现使用用于业务流和人工任务的远程 EJB 接口,因为门户客户端和流程服务器位于不同的 JVM 空间中。

创建简单的业务流程

我们可以通过独立人工任务并使用包括复杂数据类型对象 Customer 的接口来创建一个非常简单的业务流程,如图 2 所示。


图 2. 业务流程
业务流程

通过使用当前版本的 WebSphere Integration Developer (WID) V6.0.1 来开发业务流程。在参考资料的下载部分中包括来自 WID 的项目交换文件。

设置 Rational Application Developer

在我们的示例应用程序中,我们使用 Rational Application Developer (RAD) Version 6.0.1 开发 JSR 168 Portlet 应用程序,这需要以下环境设置:

  • 包括 WebSphere Process Server V6.0 运行时。
    1. 在 Portlet 应用程序中,右键单击 Properties,突出显示 Java Build Path
    2. 在 Libraries 选项卡中,单击 Add Library 按钮,突出显示 WPS Server Target,单击 Next,然后单击 Configure wps server classpath 复选框,以包含类路径。

      此外,您可以在项目环境中包括所需的 jar 文件。
  • 包括业务流程应用程序 jar 文件。
    1. 在 WebContent/WEB-INF/lib 目录中,添加 CustomerServiceApp.ear 中包含的 CustomerService.jar(参见“下载”部分)。

创建业务流 Portlet

示例中包括的 Order Initiator Portlet 主要使用 Business Flow Manager API 初始化并查看业务流程。它是 Simple Order Process 的专用 Portlet。

初始化流程

定义 Portlet 范围中的变量:

public static final String PROCESS_NAME = "SimpleOrderProcess";
            private static final String HOST_NAME = "localhost";
            private static final String PORT = "2809";
            private BusinessFlowManagerHome _bfmh = null;
            

提示主机名端口号 必须匹配目标流程服务器。例如,代码中的端口号必须匹配流程服务器中按引导地址指定的端口 2809。

要启动流程,必须首先访问 Business Flow Manager EJB。示例 Portlet 的 init 方法中包括以下代码(参见清单 1)。


清单 1. 从 init() 访问 Business Flow Manager EJB
public void init(PortletConfig config) throws PortletException {
            ……
            Hashtable env = new Hashtable();
            Context ctx = null;
            Object obj = null;
            // Define the URL string
            String strUrl = "iiop://" + HOST_NAME + ":" + PORT;
            env.put(Context.PROVIDER_URL, strUrl);
            // Look up the context
            try {
            ctx = new InitialContext(env);
            obj = ctx.lookup("com/ibm/bpe/api/BusinessFlowManagerHome");
            } catch (NamingException e) {
            e.printStackTrace();
            }
            // Access BFM home
            try {
            _bfmh = (BusinessFlowManagerHome)
            PortableRemoteObject.narrow(obj,
            com.ibm.bpe.api.BusinessFlowManagerHome.class);
            } catch (Exception e) {
            e.printStackTrace();
            }
            }

从 Portlet 的 ProcessAction 方法初始化流程(清单 2)。


清单 2. 从 processAction() 调用 InitiateProcess 函数
public void processAction(ActionRequest request, ActionResponse response) throws
            PortletException, java.io.IOException {
            ……
            // Action on the Start Instance button
            if (request.getParameter(FORM_START) != null) {
            // Get the GUI Input Message
            Hashtable input = getFormParameters(request);
            // Initiate process
            String strPIID = initiateProcess(input);
            ……
            }
            ……
            }
            

清单 3 是 initiateProcess 函数。代码假设开始时流程可以进行单个初始化接收活动,这种情况适用于许多流程。


清单 3. 初始化流程
private String initiateProcess(Hashtable input) {
            String strPIID = null;
            BusinessFlowManager bfm = null;
            String strInputTypeName = null;
            String strProcessID = null;
            // Create the process in the local scope
            try {
            bfm = _bfmh.create();
            } catch (CreateException e) {
            e.printStackTrace();
            } catch (RemoteException e) {
            e.printStackTrace();
            }
            try {
            // Get process template
            ProcessTemplateData templateData = bfm
            .getProcessTemplate(PROCESS_NAME);
            // Get input message type name
            strInputTypeName = templateData.getInputMessageTypeName();
            // Print process ID
            strProcessID = templateData.getID().toString();
            // Create message
            ClientObjectWrapper cow = bfm.createMessage(
            templateData.getID(), strInputTypeName);
            // Set input message
            if (cow.getObject() != null
            && (cow.getObject() instanceof DataObject)) {
            DataObject bdo = (DataObject) cow.getObject();
            setInputDataObject(bdo, input);
            }
            // Initiate process
            PIID objPIID =
            bfm.initiate(templateData.getName(),
            PROCESS_NAME + "-" +
            System.currentTimeMillis(), cow);
            // Set return value
            strPIID = objPIID.toString();
            } catch (Exception e) {
            e.printStackTrace();
            }
            return strPIID;
            }
            

其他实现

示例 Portlet 中还包括获取当前正在运行的流程的函数。有关其他业务流程操作函数,请参考 Business Flow Manager API,网址为:
http://publib.boulder.ibm.com/infocenter/dmndhelp/v6rxmx/index.jsp?topic=/com.ibm.wsps.javadoc.doc/doc/com/ibm/bpe/api/package-summary.html

创建人工任务 Portlet

现在让我们看看如何使用 Human Task Manager API 执行任务。在人工交互流程 Portlet 中,常见的用法是声明并完成任务,所述示例 Customer Service Portlet 会合并此操作。

声明并完成任务

定义 Portlet 范围中的变量:

private static final String HOST_NAME = "localhost";
            private static final String PORT = "2809";
            private static final String TASK_NAME = "CustomerService";
            private static final String NAME_SPACE = "http://CustomerService/com/ibm/sample";
            private HumanTaskManagerHome _htmh =  null;

提示:任务名称和命名空间来自 Simple Order Process 中的 Customer Service 任务。

清单 4 显示如何访问 Human Task Manager EJB Home。


清单 4. 访问 Human Task Manager EJB
public void init(PortletConfig config) throws PortletException {
            ……
            Hashtable env = new Hashtable();
            Context ctx = null;
            // Define the URL string
            String strUrl = "iiop://" + HOST_NAME + ":" + PORT;
            env.put(Context.PROVIDER_URL, strUrl);
            // Look up the context and access HTM Home
            try {
            ctx = new InitialContext(env);
            _htmh = (HumanTaskManagerHome) ctx
            .lookup("com/ibm/task/api/HumanTaskManagerHome");
            } catch (Exception e) {
            e.printStackTrace();
            }
            }

当单击 Approve 或 Reject 按钮时,将从 Portlet 的 processAction 方法(清单 5)声明并完成任务。清单 6 显示处于准备状态的任务的 claimAndComplete 函数。


清单 5. 从 processAction() 调用 claimAndComplete 函数
public void processAction(ActionRequest request, ActionResponse response)
            throws PortletException, java.io.IOException {
            String strTaskOption = null;
            Hashtable input =  null;
            Hashtable output =  null;
            ......
            // Action on the Approve or Reject button
            if (request.getParameter(DETAIL_APPROVE) != null
            || request.getParameter(DETAIL_REJECT) != null) {
            boolean blnApproval = false;
            if (request.getParameter(DETAIL_APPROVE) != null) {
            blnApproval = true;
            }
            // Get Output Message object values
            output = new Hashtable();
            output.put("ApprovedAmount",
            request.getParameter(FORM_AMOUNT));
            output.put("Approval", String.valueOf(blnApproval));
            String strTaskID = request.getParameter(TASK_ID).toString();
            // Claim and complete the task
            claimAndComplete(strTaskID, output);
            }
            }
            


清单 6. 声明并完成任务
private void claimAndComplete(String strTaskID, Hashtable output) {
            HumanTaskManager htm = null;
            try {
            // Create human task manager
            htm = _htmh.create();
            // Claim the task
            htm.claim(strTaskID);
            // Get the output message object
            ClientObjectWrapper cow =
            htm.createOutputMessage(strTaskID);
            DataObject dbo = (DataObject) cow.getObject();
            // Set the output data object
            setOutputDataObject(dbo, output);
            // Set the output message
            htm.setOutputMessage(strTaskID, cow);
            // Complete the task
            htm.complete(strTaskID);
            } catch (Exception e) {
            e.printStackTrace();
            }
            }

在声明任务时,如果您要将某些输入消息传递给输出消息,您可以获取输入消息,并执行如清单 7 所示的映射。


清单 7. 获取输入消息,并映射到输出
......
            try
            {
            // Get the input message wrapper
            // strTaskID as input Task ID
            ClientObjectWrapper cow = htm.getInputMessage(strTaskID);
            // Get the top level input data object
            DataObject bdo = (DataObject) cow.getObject();
            if(bdo != null)
            {
            // Map the output with input
            mapOutputToInput(bdo, output);
            } // if
            } catch (Exception e) {
            e.printStackTrace();
            }

其他实现

除声明(或未声明)任务并完成(或未能完成)任务的方法外(如前面的代码示例所示),示例人工任务 Portlet 还可以获取任务列表和任务详细信息(代码未列出,但是下面的部分会显示输出)。

通常,Human Task Manager API 会基于下面的 BPC 编程模型允许执行一组丰富的功能:

  • 创建并启动任务,然后执行任务和其他相关对象的特别查询。
  • 获取任务的输入消息、输出消息和缺省消息,然后设置输出或错误消息。
  • 检索任务的自定义属性,然后获取关于谁充当某一特定任务角色的信息。
  • 挂起、恢复、重启、终止和删除任务(用于管理),然后动态更改分配给人们的任务。

下面是 Human Task Manager API 文档链接:
http://publib.boulder.ibm.com/infocenter/dmndhelp/v6rxmx/index.jsp?topic=/com.ibm.wsps.javadoc.doc/doc/com/ibm/task/api/package-summary.html

部署 Portlet

通过以下步骤部署并测试 Portlet。

  1. 安装示例业务流程
  2. 安装 Portlet 应用程序
  3. 创建测试门户页
  4. 添加用于测试的 Portlet

安装示例业务流程

  1. 转到 WebSphere Process Server 域控制台。选择 Applications => Enterprise Applications,并单击 Install
  2. 浏览到 CustomerServiceApp.ear 文件,并单击 Next
  3. 单击 Generate Default Bindings 复选框,并使用所有缺省设置完成安装。
  4. 将更改保存到主配置中。
  5. 确保启动 Application CustomerServiceApp,如图 3 所示:

图 3. CustomerServiceApp
CustomerServiceApp

安装 Portlet 应用程序

  1. 转到 WebSphere Portal,并选择 Administration => Portlet Management => Web Modules,然后单击 Install
  2. 浏览到 SampleProcessAPIPortletApp.war 文件,并完成安装。

创建测试 Portal 页

  1. 选择 Portal User Interface => Manage Pages
  2. 单击 My Portal 链接,然后单击 New page,以创建测试页。
  3. 指定标题名称:Simple Order Process,然后单击 OK 完成页面创建。

添加用于测试的 Portlet

将 Portlet 安装到测试页:

  1. 转到 My Portal,并单击 Simple Order Process page 选项卡。
  2. 单击 Edit Page 链接。
  3. 将 Order Initiator Portlet 和 Customer Service Portlet 添加到页面。

Order Initiator Portlet

Business Flow Manager API 的 Order Initiator Portlet 主要用于启动流程实例,如图 4 中的示例条目所示。流程启动后,与流程关联的人工任务将可用于 Customer Service Portlet。此外,您可以查看当前运行的实例。


图 4. Order Initiator Portlet
Order Initiator Portlet

Customer Service Portlet

Human Task Manager API 的 Customer Service Portlet 主要用于声明并完成任务,这是在业务流程门户应用程序中执行的最常见操作。图 5 中 Portlet 的列表视图显示正在运行的处于工作准备状态的 Customer Service 任务实例。


图 5. Customer Service Portlet:任务列表视图
图 5. Customer Service Portlet:任务列表视图

针对 Simple Order Process 自定义 Customer Service Portlet 中的任务列表 GUI。换句话说,它是一个专用 Portlet。不过,可以使用人工任务为多个业务流程创建一般的 Portlet,或者使用多个任务活动为某一流程创建一般的 Portlet。在此情况下,可以改为显示一般任务属性(任务描述、任务状态等)。图 6 显示 Portlet 的详细视图,它提供了批准或拒绝活动的操作。


图 6. Customer Service Portlet:任务详细视图
图 6. Customer Service Portlet:任务详细视图




回页首


安全角色支持

示例 Portlet 运行在没有安全支持的门户服务器中。不过,在此情况下,基于角色的人员分配职能实际上不受影响。从 BPC 浏览器查看,发起者或任务所有者将是 UNAUTHENTICATED。

要激活基于角色的人工任务操作,需要启用安全选项(LDAP、Local OS 或 Custom)之一。本部分使用最常用的 LDAP 安全支持简要列出了基于角色的人员分配功能正确发挥作用所必需的基本步骤。

  1. 在门户服务器中,使用向导或 wpsconfig enable-security-ldap 来启用门户安全。
  2. 从流程服务器管理控制台:
    1. 在 LDAP 注册中心中,将所有 J2C 身份验证别名映射到现有用户。例如,对 SCA_Auth_Alias 使用 User ID wpsbind。
    2. 确保在流程服务器中,通过人工任务的人员分配插件配置的 JNDI 名称中指定的匹配 JNDI 正确配置了人员分配插件。例如,我们的示例应用程序的 Human Task CustomerService.tel 文件中指定的 bpe/staff/userregistryconfiguration。
    3. 此外,您可以使用 Business Process Container 向用户分配 BPESystemAdministrator 角色。例如,当没有分配角色时,门户用户只能查看他(或她)发起的运行实例。
  3. 从 WebSphere Integration Developer,在每个人工任务的 Staff 设置中指定所需的 Verb。例如,可以使用字段 Verb 中的“Group Search”,以分配匹配所列属性的组成员,如图 7 所示,其中 SalesReps 组被指定为人工任务的潜在所有者:CustomerService。在我们的场景中,人工任务的主要角色是潜在所有者;不过,据此可以指定其他角色。

    图 7. 潜在所有者规范
    图 7. 潜在所有者规范

  4. 从门户或 LDAP 服务器添加人员分配设置中指定的用户或组(如不存在)。
  5. 从门户为门户页和与特定用户或组关联的 Portlet 分配适当的安全设置。

配置好安全并正确地分配角色后,将任务与其所有者关联。现在,您只能允许潜在用户查看或声明并完成从 Customer Service Portlet 分配的任务。在此情况下,Portlet 将在系统日志中输出潜在所有者 ID,如图 8 所示:


图 8. 系统日志中的潜在所有者 ID
图 8. 系统日志中的潜在所有者 ID




回页首


Process API 备选方案

尽管使用 API 的流程 Portlet 具有极大的灵活性和最少数量的开销,但是还有从 Portlet 执行业务流程和人工任务的其他备选方案,例如,使用动态 UI 的知名 Process Portal(参阅 WebSphere Portal 信息中心的集成业务流程)和通过 Eclipse 向导使用 Business Process Execution Language (BPEL) 流程的用户界面生成器的 Pageflow。如果您选择基于 JSF 的流程 Portlet 应用程序,则可以使用或自定义 BPC JSF 组件/模块。您还可以使用 BPC Explorer API 集成业务流程 Web 客户端,从而获得快速门户解决方案。最后,Rational Application Developer 和 WebSphere Integration Developer 工具提供“Helper”模块,以促进与业务流程的 Portlet 集成。





回页首


简单的对比

由于 WebSphere Portal V5 附带流程门户功能,所以您可能希望使用即时可用的 Task List Portlet。不过,Task List 并不缺省提供,甚至版本 5.1.0.3 也是如此,所以在使用之前,您需要安装并适当对其进行配置。流程门户根据人工任务客户端设置中指定的页定义生成动态任务页。

作为对比,下面列出了常用的门户流程集成方法:Process Portal(动态 UI)和本文侧重介绍的 BPC API Portlet(专用)的功能。

Process Portal(动态 UI)

  • 更适用于使用其动态 UI 框架进行的多任务处理。
  • 它的 Task List Portlet 一般本身附带门户。
  • 它的中介框架测试良好,并且出错率低。
  • 它允许自定义任务详细页面的外观。

BPC API Portlet(专用)

  • 它是完全可自定义的(任务列表和详细 GUI 以及流程/任务处理),并且是最灵活的解决方案。
  • 正确使用时,它才有效。
  • 它很少依赖于门户环境或人工任务客户端设置。
  • 它允许长期保持关联的门户页/Portlet 状态。




回页首


结束语

本文向您介绍了一个完整的 Portlet 应用程序,它使用人工任务来连接到业务流程。示例 Portlet 包含使用 Business Flow Manager API 和 Human Task Manager API 的常用功能调用。本文还向您介绍了配置的全过程,包括用于流程集成的环境设置和安全支持。如前所述,使用 API 的流程 Portlet 提供了极大的灵活性和自定义,设置方便,开销较少。现在,您可以根据要求方便地定制和扩展示例 Portlet 应用程序,以构建具有完全自定义的流程门户集成的 SOA 解决方案。





回页首


致谢

作者感谢开发架构师、业务流程指导 Frank Neumann,他为本文提出了极有价值的意见。






回页首


下载

描述名字大小下载方法
WPS v6 installable application .ear 0606_gu-CustomerServiceApp.ear 20KB  FTP
Project Interchange for Simple Order Process .zip 0606_gu-OrderProjectInterchange_wid.zip 30KB  FTP
Portal Application .war 0606_gu-SampleProcessAPIPortletApp.war 41KB  FTP
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有