BPEL 实例教程


面向 Web 服务 的业 务流 程执 行语 言 (BPEL 或BPEL4WS) 是 一 种使 用 Web 服务 定义 和执 行业 务流 程的 语言 。 BPEL 使您可以通过组合、编排和协调 Web 服务自上而下地实现面向服务的体系结构 (SOA)。BPEL 提供了一种相对简单 易懂 的方 法, 可将 多个 Web 服务 组合 到一 个新 的复 合服 务( 称作 业务 流程 )中 。 本文 将介 绍如 何创 建一 个将 一系 列虚 拟的 、 与 旅 行相 关的 web 服务 结合 起来 的示 例业 务流 程, 然 后将 其部 署到 Oracle BPEL Process Manager 运行 时环 境。 BPEL 背景 知识 首先 , 介 绍一 些背 景知 识。 BPEL 基于 XML 和Web 服务 构建 ; 它 使用 一种 基于 Web 的语 言, 该 语言 支持 web 服 务技术系列,包括 SOAP、WSDL、UDDI、Web 服务可靠性消息、 Web 服务寻址、 Web 服务协调以及 Web 服务事 务。 BPEL 代表 了两 种早 期工 作流 语言 - Web 服务 流语 言 (WSFL) 和XLANG 的交 汇。 WSFL 由IBM 基于 有向 图概 念 设计。 XLANG 是一种由 Microsoft 设计的块结构化语言。 BPEL 组合了这两种方法,并提供了丰富的词汇来描述业 务流 程。 BPEL 的第 一个 版本 诞生 于 2002 年8 月。 此 后 , 随 着 许多 主要 供应 商 ( 包 括 Oracle) 的 纷 纷加 入了 , 催 生 了多 项 修 改和 改进 ,并 于 2003 年3 月推 出了 1.1 版。 2003 年4 月, BPEL 提交 结构 化信 息标 准促 进组 织 (OASIS) 以实 现 标准 化, 并 组建 了 Web 服务 业务 流程 执行 语言 技术 委员 会 (WSBPELTC)。该努力使BPEL 在业 界获 得更 广范 围的 认 可。 在企业内部, BPEL 用于标准化企业应用程序集成以及将此集成扩展到先前孤立的系统。在企业之间, BPEL 使与业 务合作伙伴的集成变得更容易、更高效。 BPEL 激发企业进一步定义它们的业务流程,从而导致业务流程的优化、重 新设计以及选择最合适的流程,进而实现了组织的进一步优化。 BPEL 中描述的业务流程定义并不影响现有系统,因 此对 升级 产生 了促 进作 用。 在 已 经或 将要 通过 Web 服务 公开 功能 的环 境中 , BPEL 是一 项重 要的 技术 。 随 着 Web 服 务的 不断 普及 , BPEL 的重 要性 也随 之提 高。 编制 与编 排 Web 服务通常公开某些应用程序或信息系统的操作。因此,组合多个 Web 服务实际上涉及基础应用程序及其功能的 集成 。 可以 用两 种方 式组 合 Web 服务 : • 编制 • 编排 在编 制 ( 通常 用于 专用 业务 流程 ) 中 , 一 个中 央流 程 ( 可以 是另 一个 Web 服务 ) 控 制相 关的 Web 服务 并协 调对 操 作 所涉 及 Web 服务 的不 同操 作的 执行 。 相 关 的 Web 服务 并不 “知道 ”(也 无需 知道 ) 它 们 参与 了组 合流 程并 在参 与更 高 级别 的业 务流 程。 只 有 编制 的中 央协 调员 知道 此目 标, 因 此 编制 主要 集中 于操 作的 显式 定义 以及 Web 服务 的调 用顺 序。 (见 图 1。) 图1:通 过编 制组 合 Web 服务 而编 排并 不依 赖某 个中 央协 调员 。 相 反 , 编 排 所涉 及的 每个 Web 服务 完全 知道 执行 其操 作的 时间 以及 交互 对象 。 编 排 是一种强调在公共业务流程中交换消息的协作方式。编排的所有参与者都需要知道业务流程、要执行的操作、要交换 的消 息以 及消 息交 换的 时间 。 ( 见 图 2。) 从组 合 Web 服务 以执 行业 务流 程的 角度 而言 ,编 制是 一个 更灵 活的 范例 ,它 相对 于编 排而 言具 有以 下优 点: • 元件 流程 的协 调由 某个 已知 的协 调员 集中 管理 • 可以 组合 Web 服务 而不 必使 它们 知道 它们 正在 参与 更大 的业 务流 程 • 可以 准备 其他 方案 以防 发生 故障 。 BPEL 支持 两种 不同 的业 务流 程描 述方 法( 支持 编制 和编 排) : • 可执 行流 程允 许指 定业 务流 程的 准确 细节 。它 们遵 循编 制范 例, 并可 由编 制引 擎执 行。 • 抽象 业务 协议 允许 只指 定双 方之 间的 公共 消息 交换 。 它 们 不包 含流 程的 内部 细节 并且 无法 执行 。 它 们 遵循 编 排 范例 。 现在,我们来逐步演示如何创建可执行的BPEL 业务流程;可以下载它的代码并将其部署到Oracle BPEL Process Manager。我们将假设已经按照安装指导成功安装了 Oracle BPEL Process Manager,并假设它使用缺省端口 9700。如 果在 安装 过程 中选 择了 其他 端口 ,则 必须 相应 地修 改示 例。 构建 业务 流程 BPEL 流程指定参与的 Web 服务的确切调用顺序 - 顺序地或并行地。使用 BPEL,您可以表述条件行为。例如,某 个Web 服务 的调 用可 以取 决于 上次 调用 的值 。 还 可 以构 造循 环、 声 明 变量 、 复 制 和赋 予值 、 定 义 故障 处理 程序 等。 通 过组合所有这些构造,您可以以算法的形式定义复杂业务流程。实际上,由于业务流程本质上属于活动图,因此使用 统一 建模 语言 (UML) 活动 图表 示它 们可 能很 有用 。 通常情况下,BPEL 业务 流程 接收 请求 。 为 了 满足 请求 , 该 流 程调 用相 关的 Web 服务,然后响应原始调用方。由于BPEL 流程 与其 他 Web 服务 通信 ,因 此它 在很 大程 度上 依赖 于复 合型 Web 服务 调用 的 Web 服务 的WSDL 描述 。 我们 来看 一个 示例 。一 个 BPEL 流程 由多 个步 骤组 成, 每个 步骤 称作 “活动 ”。BPEL 支持 基元 活动 和结 构活 动。 基元 活动 表示 基本 构造 ,用 于如 下所 示的 常见 任务 : • 使用 调用 其他 Web 服务 • 使用 (接 收请 求) 等待 客户 端通 过发 送消 息调 用业 务流 程 • 使用 生成 同步 操作 的响 应 • 使用 操作 数据 变量 • 使用 指示 故障 和异 常 • 使用 等待 一段 时间 • 使用 终止 整个 流程 。 然后,我们可以组合这些基元活动以及其他基元活动,以定义准确指定业务流程步骤的复杂算法。为组合基元活动, 图2:通 过编 排组 合 Web 服务 BPEL 支持 几个 结构 活动 。其 中最 重要 的是 : • 顺序 (),它 允许 定义 一组 将按 顺序 调用 的活 动。 • 流(),用 于定 义一 组将 并行 调用 的活 动 • Case-switch 构造 (),用 于实 现分 支 • While (),用 于定 义循 环 • 使用 能够 选择 多个 替换 路径 之一 。 每个 BPEL 业务 还将 使用 定义 合作 伙伴 链接 ,使 用 声明 变量 。 为了 理解 BPEL 是如 何描 述业 务流 程的 , 我 们 将定 义雇 员出 差安 排的 简化 业务 流程 : 客 户 端调 用此 业务 流程 , 指 定 雇 员姓 名、 目 的 地、 出 发 日期 以及 返回 日期 。 此 BPEL 业务 流程 首先 检查 雇员 出差 状态 。 我 们将 假设 存在 一个 可用 于 进 行此 类检 查的 Web 服务 。 然 后 , 此 BPEL 流程 将检 查以 下两 家航 空公 司的 机票 价格 : 美 国航 空公 司和 达美 航空 公司 。 我们 将再 次假 设这 两家 航空 公司 均提 供了 可用 于进 行此 类检 查的 Web 服务 。最 后, 此 BPEL 流程 将选 择较 低的 价格 并将 出差 计划 返回 给客 户端 。 然后 ,我 们将 构建 一个 异步 BPEL 流程 。我 们将 假设 用于 检查 雇员 出差 状态 的 Web 服务 是同 步的 。由 于可 以立 即获 取此数据并将其返回给调用方,因此这是一个合理的方法。为了获取机票价格,我们使用异步调用。由于确认飞机航 班时 刻表 可能 需要 稍长 的时 间, 因 此 这也 是一 个合 理的 方法 。 为 简 化示 例, 我 们 假设 以上 两家 航空 公司 均提 供了 Web 服 务, 且这 两个 Web 服务 完全 相同 (即 提供 相同 的端 口类 型和 操作 ) 。 在实 际情 形下 , 您 通常 无法 选择 Web 服务 , 而 是必 须使 用您 的合 作伙 伴提 供的 服务 。 如 果 您有 幸能 够同 时设 计 Web 服 务和 BPEL 流程 , 则 应 考虑 用哪 个接 口更 好。 通 常 , 您 将 对持 续时 间较 长的 操作 使用 异步 服务 , 而 对在 相对 较短 的 时 间内 返回 结果 的操 作使 用同 步服 务。 如果 使用 异步 Web 服务 ,则 BPEL 流程 通常 也是 异步 的。 当您 用 BPEL 定义 业务 流程 时, 您 实 际上 定义 了一 个由 现有 服务 组成 的新 Web 服务 。 该 新 BPEL 复合 Web 服务 的 接口 使用 一组 端口 类型 来提 供类 似任 何其 他 Web 服务 的操 作。 要调 用用 BPEL 描述 的业 务流 程, 则必 须调 用生 成的 复合 Web 服务 。图 3 是我 们流 程的 示意 图。 图3:出 差安 排示 例 BPEL 流程 在开 发此 示例 BPEL 流程 的过 程中 ,您 将经 历下 列步 骤: • 熟悉 相关 的 Web 服务 • 为此 BPEL 流程 定义 WSDL • 定义 合作 伙伴 链接 类型 • 开发 此 BPEL 流程 : o定义 合作 伙伴 链接 o声明 变量 o编写 流程 逻辑 定义 。 第1 步: 列出 相关 Web 服务 的清 单 在您 开始 编写 BPEL 流程 定义 之前 , 必 须 先熟 悉从 业务 流程 中调 用的 Web 服务 。 这 些服 务称 作合 作伙 伴 Web 服务 。 本示例使用雇员出差状态Web 服务以及美国航空公司和达美航空公司Web 服务(这两个Web 服务具有相同的 WSDL 描述)。(同样,本示例中使用的Web 服务是虚构的。) 雇员出差状态Web 服务雇员出差状态Web 服务提供EmployeeTravelStatusPT 端口类型,通过它可以使用 EmployeeTravelStatus 操作 检查 雇员 出差 状态 。 此 操作 将返 回雇 员可 以使 用的 乘机 标准 ( 可 能为 经济 舱、 商 务 舱或 头 等 舱)。(见图4。) 航空公司 Web 服务航空公司 Web 服务是异步的;因此它指定了两个端口类型:第一个端口类型 FlightAvailabilityPT 用于 使用 FlightAvailability 操作 检查 航班 可用 性。 为 返 回结 果, 该 Web 服务 指定 了第 二个 端口 类型 FlightCallbackPT。 此端 口类 型指定 FlightTicketCallback 操作 。 尽管 航空 公司 Web 服务 定义 了两 个端 口类 型, 但 它只 实现 FlightAvailabilityPT。FlightCallbackPT 则由 作为 Web 服务 客户 端的 BPEL 流程 实现 。图 5 是此 Web 服务 体系 结构 的示 意图 : 第2 步: 为 BPEL 流程 定义 WSDL 接下 来, 我 们 必须 将此 业务 出差 BPEL 公开 为 Web 服务 。 因 此 , 第 二 步是 为它 定义 WSDL。 此 流 程将 必须 从它 的 客 户端接收消息并返回结果。它必须公开TravelApprovalPT 端口类型,后者将指定一个输入消息。它还必须声明 ClientCallbackPT 端口 类型 (用 于使 用回 调将 结果 异步 返回 给客 户端 ) 。 图 6 说明 了此 流程 。 图4:雇 员出 差状 态 Web 服务 图5:航 空公 司 Web 服务 第3 步: 定义 合作 伙伴 链接 类型 第三 步是 定义 合作 伙伴 链接 类型 。 合 作伙 伴链 接类 型表 示 BPEL 流程 与相 关方 ( 包括 BPEL 流程 调用 的 Web 服务 以 及调 用 BPEL 流程 的客 户端 )之 间的 交互 。 本示例包含三个不同的合作伙伴:客户端、雇员出差状态服务和航空公司服务。理想情况下,每个 Web 服务都应在 WSDL 中定义相应的合作伙伴链接类型。(实际情形可能不是这样的。)然后,我们可以使用WSDL 包装 合作 伙伴 Web 服务 (导 入 Web 服务 的 WSDL 并定 义合 作伙 伴链 接类 型) 。 或者 ,我 们可 以在 BPEL 流程 的 WSDL 中定 义所 有合 作伙 伴链 接。 但由 于此 方法 违反 了封 装原 则, 因此 不建 议使 用。 对于 本示 例, 我们 定义 了三 个合 作伙 伴链 接类 型( 每个 类型 位于 Web 服务 的相 应 WSDL 中): • travelLT: 用 于描 述此 BPEL 流程 客户 端与 此 BPEL 流程 本身 之间 的交 互。 此 交 互是 异步 交互 。 此 合作 伙伴 链 接类 型在 此 BPEL 流程 的 WSDL 中定 义。 • employeeLT: 用 于 描述 此 BPEL 流程 与雇 员出 差状 态 Web 服务 之间 的交 互。 此 交 互是 同步 交互 。 此 合 作伙 伴 链接 类型 在雇 员 Web 服务 的 WSDL 中定 义。 • flightLT:描述此BPEL 流程 与航 空公 司 Web 服务 之间 的交 互。 此 交互 是异 步交 互, 且 航空 公司 Web 服务 对 此BPEL 流程 调用 一个 回调 。此 合作 伙伴 链接 类型 在航 空公 司 Web 服务 的 WSDL 中定 义。 每个合作伙伴链接可以拥有一个或两个角色,我们必须为每个角色指定它使用的 portType。对于同步操作,由于操作 只是单向调用,因此每个合作伙伴链接类型仅有一个角色。例如,此BPEL 流程对雇员出差状态Web 服务调用 EmployeeTravelStatus 操作 。由 于它 是同 步操 作, 因此 此 BPEL 流程 等待 完成 并仅 在完 成操 作后 取得 响应 。 对于异步回调操作,我们必须指定两个角色。第一个角色描述客户端操作调用。第二个角色描述回调操作调用。在本 示例 中, BPEL 流程 与航 空公 司 Web 服务 之间 存在 一个 异步 关系 。 正如 我们 已经 指出 的, 我 们 需要 三个 合作 伙伴 链接 类型 : 两 个 链接 类型 指定 两个 角色 ( 因 为它 们是 异步 的) , 一 个 链 接 类型 指定 一个 角色 (因 为它 是同 步的 ) 。 合作伙伴链接类型在特殊命名空间 http://schemas.xmlsoap.org/ws/2003/05/partner-link/ 的WSDL 定义。首先,我们在 客户 端使 用的 BPEL 流程 WSDL 中定义 travelLT 链接 类型 以调 用此 BPEL 流程。所需的第一个角色是出差服务(即, 我们的BPEL 流程)的角色。客户端使用TravelApprovalPT 端口类型与此BPEL 服务通信。第二个角色 travelServiceCustomer 描述 了此 BPEL 流程 将在 ClientCallbackPT 端口 类型 中对 其执 行回 调的 客户 端的 特征 : 图6:此 BPEL 流程 的 WSDL 第二 个链 接类 型是 employeeLT。它用于描述此BPEL 流程 与雇 员出 差状 态 Web 服务 之间 的通 信, 并 在此 雇员 Web 服 务的 WSDL 中定义。此交互是同步交互,因此我们需要一个名为 employeeTravelStatusService 的角色。此 BPEL 流 程使 用雇 员 Web 服务 上的 EmployeeTravelStatusPT: 最后一个合作伙伴链接类型 flightLT 用于描述此 BPEL 流程与航空公司 Web 服务之间的通信。此通信是异步通信。 此BPEL 流程对航空公司 Web 服务调用一个异步操作。此 Web 服务在完成请求后对此 BPEL 流程调用一个回调。 因此,我们需要两个角色。第一个角色描述航空公司Web 服务对于此BPEL 流程服务的角色,即航空公司服务 (airlineService)。此 BPEL 流程使用 FlightAvailabilityPT 端口类型进行异步调用。第二个角色描述了此 BPEL 流程对 于航 空公 司 Web 服务 的角 色。 对于 航空 公司 Web 服务 而言 ,此 BPEL 流程 是一 个航 空公 司客 户, 因此 角色 名称为 airlineCustomer。 航 空公 司 Web 服务 使用 FlightCallbackPT 端口 类型 进行 回调 。 此 合作 伙伴 链接 类型 在航 空公 司 Web 服务 的 WSDL 中定 义: 了解 合作 伙伴 链接 类型 对于 开发 BPEL 流程 规范 至关 重要 。 有 时 , 它 可 以帮 助生 成所 有交 互的 图表 。 定 义 合作 伙伴 链 接类 型后 ,我 们已 经完 成了 准备 阶段 ,并 准备 开始 编写 业务 流程 定义 。 第4 步: 创建 业务 流程 现在 , 您 就可 以开 始编 写 BPEL 流程 了。 通 常, BPEL 流程 等待 客户 端传 入的 消息 , 以 启动 业务 流程 的执 行。 在 本 示 例中,客户端通过发送输入消息TravelRequest 启动此BPEL 流程。然后,此BPEL 流程通过发送 EmployeeTravelStatusRequest 消息调用雇员出差状态Web 服务。由于此调用是同步调用,因此它等待 EmployeeTravelStatusResponse 消息。然后,此BPEL 流程 通过 向上 述两 家航 空公 司 Web 服务 发送 FlightTicketRequest 消息对它们进行并发异步调用。每个航空公司 Web 服务通过发送 TravelReponse 消息进行回调。然后,此 BPEL 流 程选 择较 合适 的航 空公 司并 使用 TravelResponse 消息 对客 户端 进行 回调 。 我们 首先 编写 一个 空的 BPEL 流程 提纲 ,它 展示 了每 个 BPEL 流程 定义 文档 的基 本结 构: 我们 首先 添加 所需 的命 名空 间。 此 处 , 我 们 必须 定义 目标 命名 空间 以及 用于 访问 雇员 和航 空公 司 WSDL 以及 此 BPEL 流程 WSDL 的命 名空 间。 我们 还必 须为 所有 BPEL 活动 标记 声明 命名 空间 (此 处采 用缺 省命 名空 间, 以便 不必 限定 每个 BPEL 标记名)。BPEL 活动 命名 空间 必须 为 http://schemas.xmlsoap.org/ws/2003/03/business-process/: ... 合作 伙伴 链接 接下 来, 我 们必 须定 义合 作伙 伴链 接, 它 们定 义与 此 BPEL 流程 交互 的不 同方 。 每 个 合作 伙伴 链接 都 与 描述 其特 性的 特定 partnerLinkType 相关 。每 个合 作伙 伴链 接还 最多 指定 两个 属性 : • myRole:表 明业 务流 程本 身的 角色 。 • partnerRole:表 明合 作伙 伴的 角色 。 合作伙伴链接仅可以指定一个角色,通常同步请求 /响应操作也仅能指定一个角色。对于异步操作,它指定两个角色。 在本 示例 中, 我们 定义 四个 角色 。第 一个 合作 伙伴 链接 称作 客户 端,由 travelLT 合作 伙伴 链接 类型 描述 其特 性。 此客 户端 调用 该业 务流 程。 我们 需要 指定 myRole 属性 以描 述此 BPEL 流程 (travelService) 的角 色。 我们 必须 指定 第二 个 角色 : partnerRole。此 处, 该角 色为 travelServiceCustomer,它 描述 BPEL 流程 客户 端的 特性 。 第二 个合作伙伴链接称作employeeTravelStatus,由 employeeLT 合作 伙伴链接类型描述其特性。它是BPEL 流程与 Web 服务 之间 的一 个同 步请 求 /响应 关系 ; 我 们 再次 仅指 定一 个角 色。 此 时 , 该 角 色为 partnerRole, 这 是因 为我 们描 述 了Web 服务 (它 是此 BPEL 流程 的合 作伙 伴) 的角 色: 最后 两个 合作 伙伴 链接 对应 于航 空公 司 Web 服务 。 由 于 它们 使用 同一 类型 的 Web 服务 , 因 此 我们 基于 一个 合作 伙 伴 链接类 型 flightLT 指定两 个合 作伙 伴链 接。 此处 ,由 于我 们使 用异 步回 调通 信, 因此 需要 两个 角色 。此 BPEL 流程 (myRole) 对于 航空 公司 Web 服务 的角 色为 airlineCustomer,而 航空 公司 (partnerRole) 的角 色为 airlineService: 变量 BPEL 流程 中的 变量 用于 存储 消息 以及 对这 些消 息进 行重 新格 式化 和转 换。 您 通常 需要 为发 送到 合作 伙伴 以及 从 合作伙伴收到的每个消息定义一个变量。就我们的流程而言,我们需要七个变量。我们将它们命名为 TravelRequest、 EmployeeTravelStatusRequest、EmployeeTravelStatusResponse、FlightDetails、FlightResponseAA、FlightResponseDA 和 TravelResponse。 我们 必须 为每 个变 量指 定类 型。 可 以 使用 WSDL 消息类型、XML 模式 简单 类型 或 XML 模式 元素 。 在 我们 的示 例 中, 我们 对所 有变 量使 用 WSDL 消息 类型 : BPEL 流程 主体 流程 主体 指定 调用 合作 伙伴 Web 服务 的顺 序。 它 通 常以 (用 于定 义多 个将 按顺 序执 行的 操 作) 开 始 。 在 顺 序中 , 我 们 首先 指定 启动 业务 流程 的输 入消 息。 我 们 使用 构造 ( 它 等待 匹配 消息 , 在 本 示 例 中为 TravelRequest 消息)实现此目的。在 构造中,我们不直接指定消息。而是指定合作伙伴链接、端口类 型、 操作 名称 以及 可选 变量 (用 于保 存收 到的 消息 以用 于随 后的 操作 ) 。 我们 将消 息接 收与 客户 端合 作伙 伴链 接在 一起 , 并 等待 对端 口类型 TravelApprovalPT 调用 TravelApproval 操作 。 我 们 将收 到的 消息 存储到 TravelRequest 变量 中: ... 等待客户端调用 TravelApproval 操作,并将传入的消息以及有关业务出差的参数存储到 TravelRequest 变量 中。 此处 ,此 变量 名与 消息 名相 同, 但并 不一 定要 相同 。 接下 来, 我 们 需要 调用 雇员 出差 状态 Web 服务 。 但 在调 用之 前, 我 们 必须 为此 Web 服务 准备 输入 。 查 看 雇员 Web 服 务的 WSDL, 可以 看到 我们 必须 发送 由雇 员部 分组 成的 消息 。 我们 可以 通过 复制 客户 端发 送的 消息 的雇 员部 分来 构 造 此消 息。 编写 相应 的赋 值语 句: ... ... 现在,我们就可以调用雇员出差状态Web 服务了。为了进行同步调用,我们使用 活动。我们使用 employeeTravelStatus 合作伙伴链接,并对 EmployeeTravelStatusPT 端口类型调用 EmployeeTravelStatus 操作。我们已 经在 EmployeeTravelStatusRequest 变量 中准备了输入消息。由于它是同步调用,因此该调用等待回应并将其存储在 EmployeeTravelStatusResponse 变量 中: ... ... 下一 步是 调用 上述 两个 航空 公司 Web 服务 。 同 样, 我 们 先准 备所 需的 输入 消息 ( 这两 个 Web 服务的输入消息相同)。 FlightTicketRequest 消息 包含 两部 分: • flightData:它 从客 户端 消息 (TravelRequest) 中检 索而 得。 • travelClass:它从 EmployeeTravelStatusResponse 变量 中检 索而 得。 因此 ,我 们编 写一 个包 含两 个 copy 元素 的赋 值: ... ... 输入 数据 包含 需要 传递 给航 空公 司 Web 服务 的数 据。 由 于格 式相 同, 因 此我 们可 以使 用一 个简 单复 制直 接传 递它 。 在 实际情 况下 ,通 常需 要执 行转 换。 为此 ,可 以使 用具 有 的XPath 表达式 、使 用转 换服 务( 如 XSLT 引擎) 或使 用由 特定 BPEL 服务 器提 供的 转换 功能 。 现在 ,我 们准 备调 用这 两个 航空 公司 Web 服务 。我 们将 进行 并发 的异 步调 用。 为表 述并 发, BPEL 提供 了 活 动。 对每 个 Web 服务 的调 用将 包含 两个 步骤 : • 使用 活动 进行 异步 调用 。 • 使用 活动 等待 回调 。 我们使 用 对这两 个活 动进 行分 组。 这两 个调 用只 在合 作伙 伴链 接名 称上 存在 差别 。我 们对 一个 调用 使用 AmericanAirlines, 对 另 一个 调用 使用 DeltaAirlines。 两 者 均对 FlightAvailabilityPT 端口 类型 调用 FlightAvailability 操作, 发送 FlightDetails 变量 中的 消息 。 使用 活动 接收 回调 。 我 们 再次 使用 这两 个合 作伙 伴链 接名 。 等待对 FlightCallbackPT 端口 类型 调 用 FlightTicketCallback 操作 。我 们将 结果 消息 分别 存储到 FlightResponseAA 和FlightResponseDA 变量 中: ... ... 在该 流程 的这 个阶 段, 我 们收 到两 个机 票报 价。 在 下一 步中 , 我 们 必须 选择 一个 机票 报价 。 为 此 , 我 们 使用 活 动。 ... ... 在 元素中 ,我 们检 查美 国航 空公 司的 机票 报价 (FlightResponseAA) 是等于 还是 低于 达美 航空 公司 的机 票报价 (FlightResponseDA)。 为 此 , 我 们 使用 BPEL 函数 getVariableData 并指 定变 量名 。 价 格 位于 confirmationData 消息 的 内 部,虽然它是唯一的消息部分,但我们仍必须指定它。我们还必须指定查询表达式以找到价格元素。此处,我们采用 简单 的 XPath 1.0 表达 式。 如果 美国 航空 公司 的机 票报 价低 于达 美航 空公 司的 机票 报价 , 则将 FlightResponseAA 变量 复制到 TravelResponse 变量 (我 们最 终将 此变 量返 回给 客户 端) 。 否则 ,我 们将 复制 FlightResponseDA 变量 。 我们 已经 到达 此 BPEL 业务 流程 的最 后一 步 — 使用 活动 将回 调返 回给 客户 端。 对 于此 回调 , 我 们 使用 客 户 端合 作伙 伴链 接并对 ClientCallbackPT 端口 类型 调用 ClientCallback 操作 。保 存答 复消 息的 变量为 TravelResponse: ... 到此 , 我 们已 经完 成了 我们 的第 一个 BPEL 业务 流程 规范 。 您 可以 看到 , BPEL 并不 是很 复杂 , 并允 许相 对简 单和 自 然的 业务 流程 规范 。 第5 步: 部署 和测 试 我们部 署到 Oracle BPEL Process Manager 的每个 BPEL 流程都 需要 一个 流程 描述 符。 BPEL 标准不 包括 此流 程描述 符, 且 它特 定于 BPEL 服务 器。 部 署流 程描 述符 是流 程在 给定 平台 上的 唯一 实现 部分 , 必 须重 写它 才能 在不 同 BPEL 引擎上运行该流程。Oracle 流程 描述 符是 一个 XML 文件,它指定有关BPEL 流程的以下细节:BPEL 源文件名、BPEL 流程名 (ID)、所有合作伙伴链接 WSDL Web 服务的 WSDL 位置以及可选的配置属性。流程描述符的默认文件名为 bpel.xml,但 我们 可以 使用 任何 其他 名称 : 后续 步骤 下载 用于 Web 服务的业务 流程执 行 语言 一书 中的 示例 章节 。 访问 Web 服务 技术 中心 Travel.wsdl http://localhost:9700/orabpel/default/Employee/Employee?wsdl http://localhost:9700/orabpel/default/AmericanAirline/AmericanAirline?wsdl http://localhost:9700/orabpel/default/DeltaAirline/DeltaAirline?wsdl 我们 现在 准备 启动 BPEL Process Manager。 可 以 从开 始菜 单 ( 如 果使 用 Windows) 或 通 过执行 c:\orabpel\bin 目录 中 的 startOraBPEL 脚本 (假 设 Oracle BPEL Process Manager 已经 安装到 c:\orabpel 中) 来执 行此 操作 。为 便于 访问 ,建 议 将此 目录 包含 在 PATH 中。 Oracle BPEL Process Manager 包含 一个 名为 obant 的Ant 实用 程序 ,用 于配 置复 杂的 编译 和部 署方 案。 obant 只是 一 个围绕标准 Ant 的包装程序,用于设置环境,然后调用标准 Ant Java 任务。要使用它,我们必须准备相应的项目文 件( 通常 名为 build.xml) 。 以 下是 出差 示例 流程 的项 目文 件: 要编 译和 部署 此 BPEL 流程 ,我 们只 需从 命令 行启 动 obant。 既然 我们 已经 在 Oracle BPEL 服务 器上 成功 部署 了 BPEL 流程 , 那 我 们就 执行 它。 Oracle BPEL Process Manager 提供 了一个BPEL 控制台,通过它可以在BPEL 服务器域中执行、监视、管理和调试BPEL 流程。可以通过 http://localhost:9700/BPELConsole/ 访问 BPEL 控制 台。 我 们必 须单 击流 程名 、 填 写 以下 表单 并按 Post XML Message 按 钮: 我们现在看到一个屏幕,通知我们正在异步处理流程实例。我们可以选择执行、实例审计或实例调试的可视化流。实 例的 可视 化流 以图 形方 式显 示了 BPEL 流程 实例 的执 行。 我 们 可以 监视 流程 的执 行及 其状 态 ( 正 在运 行、 已 完 成、 已 取消或过时): 图7:BPEL 控制 台 Oracle BPEL Process Manager 提供 了多个用于审计、管理、调试和部署BPEL 流程 的选项。有关更多信息,请查看 产品 文档 。 结论 现在 ,您 已经 熟悉 了使 用 BPEL 组合 Web 服务 的基 本概 念, 您可 以更 深入 地研 究更 高级 的概 念。 我的 下一 篇文 章将 介绍 一些 高级 BPEL 特性 ,如 故障 处理 、范 围、 补偿 、并 发活 动以 及事 件处 理。 图8:实 例流 的图 形视 图
还剩19页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 6 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

finalsyo

贡献于2013-11-20

下载需要 6 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf