实现 Oracle 集成 B2B 和 Oracle BPEL 流程管理器的互操作
作者:Jeffrey Hutchins,电子商务策划师,Oracle SOA 套件产品经理
2006 年 12 月发布
背景
从业务角度而言,无论是在企业内扩展业务流程还是将其扩展到供应链,您都必须妥善处理两个基本的东西:数据和流程。每个端点都将有其自己的表示,企业到企业 (B2B) 也不例外。在 B2B 领域,一般需要说明的是:
- B2B 是以文档为中心的。
- 在企业级别,文档是异步的。
- 头信息不包含在有效载荷中。
- 不保证排序。
- 有多个文档标准。
- 实施时,每个标准均存在多个变种。
因此,当流程从 B2B 网关接收文档或向其发送文档时,它必须能够:
- 识别文档
- 管理多个文档
- 管理文档差异
- 关联多个文档
- 管理错误
|
在本篇技术说明中,将以“订单到现金”流程中的两个事务集(文档)为例:购买订单:出站和支付:入站
文档管理
流程如何识别文档?
文档通过 Oracle 高级队列(IP_IN_QUEUE 和 IP_OUT_QUEUE)在集成 B2B 和 BPEL 流程管理器间进行交换。在集成 B2B 中,这些队列称为内部传送通道 (Internal Delivery Channel)。在 BPEL 流程管理器中,可通过 Partnerlink 访问这些队列。
| 集成 B2B |
Routing Id |
每个文档定义都指定有一个供 AQ 用户使用的唯一路由 Id。默认值为 B2BUSER |
| BPEL 流程管理器 |
Partnerlink |
每个 partnerlink 都指定有一个“Consumer”。流程可识别将由 Consumer 取消排队的文档。 |
流程从 B2B 网关接收文档(入站)。将 AQ consumer 和 routing_id 设为 820_PAYMENT。如此,流程将能够识别入站文档。
| 支付 |
入站 |
集成 B2B:文档定义
|
Routing id = |
820_PAYMENT |
|
BPEL 流程管理器:AQ 适配器
|
Consumer = |
流程向 B2B 网关发送文档(出站)。将 AQ recipient 设为 B2BUSER,将 routing_id 设为 <blank>。如此,流程将能够传递出站文档。
| 购买订单 |
出站 |
集成 B2B:文档定义
|
Routing id = |
<blank> |
|
BPEL 流程管理器:AQ 适配器
|
Recipient = |
B2BUSER |
多个流程使用一个文档(入站/出站)。要使流程能够识别入站文档,将 AQ consumer 和 routing_id 设为 850_PurchaseOrder。要使网关能够识别出站文档,将 AQ recipient 设为 B2BUSER 并忽略 routing_id。
| 购买订单 |
出站 |
集成 B2B:文档定义
|
Routing id = |
850_PurchaseOrder |
|
BPEL 流程管理器:AQ 适配器
|
Recipient = |
B2BUSER |
| 入站 |
集成 B2B:文档定义
|
Routing id = |
850_PurchaseOrder |
|
BPEL 流程管理器:AQ 适配器
|
Consumer = |
850_PurchaseOrder |
流程如何管理文档差异?
即使只使用一个标准,文档也会存在差异。实施者可以:
- 遵循标准
- 在规范内应用差异(添加代码、更改必填/可选字段、更改数据的放置/语义等)
- 应用扩展
- 将文档从规范中剔除 —“一次性”文档
解决同一标准中存在的差异。在理想情况下,每个参与方都应遵循标准,但实际上,差异会经常出现且必须包容这些差异。在端到端集成中保留这些差异将造成不可伸缩和不可重用;然而,如果使用超集 XML 模式,则是最佳做法。该方法将给予您最大的灵活性。
| 集成 B2B |
- 选项 1:保留支持验证的原始定义
- 选项 2:利用禁用验证的超集 XML 模式
|
| BPEL 流程管理器 |
- 利用超集 XML 模式
- 验证 XML 实例
- 通过使用 IP_MESSAGE_TYPE 数据识别贸易合作伙伴调用适当的 XSLT 映射
|
使用 BPEL Pick 流程活动
如果超集 XML 模式无法表示文档中的差异,或企业要求规定业务流程管理多个标准和/或端点,那么,创建多个 partnerslink 并利用 Pick 活动:
- 在 Pick 活动内使用 On Message 活动来管理每一个 partnerlink 交互。
- 将标志(布尔变量)设置为支持流程识别相应的流。
- 使用 IP_MESSAGE_TYPE 提供的信息调用适当的 XSLT 映射。(技术说明稍后部分有述)
| 集成 B2B |
定义支持验证的原始文档 |
| BPEL 流程管理器 |
- 为每个文档定义单独的 partnerlink
- 为每个 partnerlink 定义 Pick 流程活动(设置流程流的标志并调用 XSLT 相应的映射)
|
Oracle 应用程序开发框架 (ADF)
本技术说明着重关注建模,而不是编码和建模的最佳实践。注意:该适配器框架中具有支持文档识别、指定 XSD 以及从编码角度启动流程或流程步骤的功能。更多详细信息,请参阅应用程序开发框架开发人员指南 10g 版本 (10.1.3.0)(第 1 章和第 20 章)中的这一主题。
为什么要建立公用数据模型?
要避免导致 nn-1 情况出现的点到点映射,可建立公用数据模型来表示业务对象 — 例如购买订单和支付。该最佳实践需要许多前期工作,但最终将得到一个可伸缩的灵活解决方案。安装基于该模型的规范 XML 模式可使每个端点系统映射到一致的目标(在本例中为购买订单和支付文档)。
流程管理
流程如何关联多个文档?
如前所述:
- B2B 是以文档为中心的。
- 在企业级别,文档是异步的。
- 头信息不包含在有效载荷中。
- 不保证排序。
因此,当流程从 B2B 网关接收消息时,它必须能够按有效载荷中的内容关联文档。
- Oracle AQ consumer 识别文档,而关联识别正确的流程实例。例如:将启动文档采购订单与响应文档支付相关联。
- 在 BPEL 流程管理器中,可通过创建关联集来完成该任务。(注意:要执行关联,有效载荷中必须存在唯一标识符。)
- 根据流程的复杂程度,可能需要多个关联集。
文档关联:步骤
- 创建关联集。
- 创建属性。
- 创建属性别名。
| 关联集 |
关联集名称 |
PO_Payment_Cor_Set |
| 属性 |
保存值的变量 |
PO_Payment_Value |
| 属性别名
|
xPath:提取 PO 值 |
/ns2:PurchaseOrder/ns2:PO_Number |
| xPath:提取 PO 值
|
/ns4:Payment/ns4:PO_Number |
在本例中,PO Number 是用于关联启动和响应文档的唯一标识符。
流程如何获取有关文档的信息?
如果要将业务流程扩展到企业之外,则必须确定并解决 B2B 标准/协议和企业内使用的标准/协议之间的差异:
|
将流程扩展到企业之外 (B2B)
|
在企业内扩展流程 (EAI / A2A)
|
| 安全性 |
良好的定义和认证 |
选项各不相同 |
| 传输 |
良好的定义和认证 |
选项各不相同 |
| 文档 |
标准(头和有效载荷) |
通常为 B2B(仅有效载荷) |
| 合作伙伴信息 |
本身固有 |
用户定义/协议相关 |
| 头信息 |
本身固有 |
用户定义/协议相关 |
Oracle 集成 B2B 提供的结构带有可填补这些差距的信息。IP_MESSAGE_TYPE 是一个支持在这些组件中进行交互的头。
|
出站
|
在 BPEL 流程管理器中设置 |
使集成 B2B 可以识别协议 |
| 入站 |
在集成 B2B 中设置 |
提供 BPEL 流程附加信息 |
IP_MESSAGE_TYPE(示例)
| 字段 |
说明 |
| Msg_Id
|
文档的唯一标识符
- 由贸易合作伙伴指定的 GUID(入站文档)
- 由中间件流程指定的 GUID(出站文档)
|
| Inreplyto_Msg_Id |
响应前一个文档时收到的 MSG_ID。如果中间件由文档启动,则指定为 Null。 在响应前一个文档时指定为 MSG_ID。
|
| From_Party |
发送文档的贸易合作伙伴。 |
| To_Party |
接收文档的贸易合作伙伴。 |
| Action_Name |
定义文档可为 null 的业务操作。 |
| Doctype_Name |
文档类型,如集成 B2B 示例中定义所示: “850” |
| Doctype_Revision |
文档修订,如集成 B2B 示例中定义所示: “4010” |
| Msg_Type |
指定为 1, 2, 3(请求|响应|确认) |
| Payload |
在流程中指定 |
| Attachment |
在流程中指定 |
错误处理
应创建错误处理流程以降低所有端点中的错误率。B2B 网关提供了许多错误信息源。利用该信息,可创建集中的错误流程来解决业务与合规性要求方面的问题。这些结构是:
- IP_EXCEPTION:出现错误时,IP_EXCEPTION 数据将被发送回使用 consumer B2BERRORUSER 的流程。
- IP_MESSAGE_TYPE:错误出现时,IP_MESSAGE_TYPE 将提供基本信息。
- b2b_InstanceMessage:该运行时信息库的公共视图可提供每一个转换的详细信息。这些结构的唯一键是 b2bMessageId。
利用该信息,错误流程可精确地识别出错误类型并启动相应的业务流程。
IP_EXCEPTION(示例)
| 字段 |
示例 |
| correlationId |
null |
| b2bMessageId |
A9FE198110F30698B9B0000014B6C510 |
| errorCode |
AIP-50079 |
| errorText |
Transport error:[IPT_HttpSendConnectionRefused] HTTP connection is refused.Connection refused:connect |
| errorDescription |
Transport error:[IPT_HttpSendConnectionRefused] HTTP connection is refused.Connection refused:connect |
| errorSeverity |
2 |
IP_MESSAGE_TYPE(示例)
| 字段 |
示例 |
| Msg_Id |
A9FE198110F30698B9B0000014B6C510 |
| Inreplyto_Msg_Id |
|
| From_Party |
Acme |
| To_Party |
GlobalChips |
| Action_Name |
Exception |
| Doctype_Name |
Exception |
| Doctype_Revision |
1.0 |
| Msg_Type |
3 |
| Payload |
|
| Attachment |
|
DB 视图:b2b_InstanceMessage(结构)
| 字段 |
说明 |
| id |
系统生成的消息 id。 |
| referToId |
父消息的 id,如果有(id 850、855 等)。 |
| b2bMessageId |
发送或接收消息时消息中使用的 ID。 |
| receiverId |
接收方 id 类型和值。例如:DUNS 987654321 |
| senderId |
发送方 id 类型和值。例如:DUNS 123456789 |
| senderName |
发送方名称。例如:Acme |
| receiverName |
接收方名称。例如:GlobalChips |
| acknowledgeMode |
Sync/Async(同步/异步)。 |
| messageDateTime |
为从后端系统接收的消息或向其发送的消息添加时间戳记。 |
| messageType |
消息类型,如 Request/Acknowledgment |
| state |
消息状态,如 Complete/Error |
| remainingRetry |
剩余尝试次数。 |
| direction |
该消息的方向。例如:Inbound/Outbound(入战/出战) |
| timeToAck |
确认时间(分钟)。 |
| errorCode |
是否有错误要处理,例如:AIP-11111 |
| errorText |
是否有错误要处理。 |
| errorDescription |
是否有错误要处理。 |
| protocolMessageId |
用于根据协议关联消息。 |
| documenttype |
该消息的文档类型。例如: 850 1.0 |
| b2btimestamp |
传输线路上发送或接收到消息的时间戳。 |
| conversationId |
用于关联 2 个以上的消息。 |
| protocolworkarea |
用作该消息的临时存储。 |
| correlationId |
用于关联 2 个消息。 |
| transactionControlNumber |
事务控制号。例如: 1001 |
| groupControlNumber |
组控制号。例如: 1001 |
| interchangeControlNumber |
交换控制号。例如: 1001 |
| agreement |
该消息的协议 id。 |
| documentProtocol |
该消息的文档协议。例如:X12 4010 |
| exchangeProtocol |
该消息的交换协议。例如:AS2 1.0 |
| transportProtocol |
该消息的传输协议。例如:HTTP 1.1 |
| url |
该消息的发送传输 URL。例如:http://machine:port/b2b |
| payload |
未打包的有效载荷。 |
| wirePayload |
打包的有效载荷。 |
结论
在传统观念中,企业到企业集成与 SOA 理念背道而驰,完全不同于所有其他类型的集成。事实上,若要成功实施任何一个集成项目,该集成必须以解决方案为基础、由业务要求驱动并涉及整个端到端解决方案。B2B 只是另一个端点。
总而言之,要将流程扩展到企业之外,该流程必须能够:
- 识别文档
- 管理多个文档
- 管理文档差异
- 关联多个文档
- 管理错误
本技术说明介绍了一些实现这些目标的技术。
您可在 SOA 套件论坛或集成 B2B 论坛中探讨该技术说明。
Jeffrey Hutchins 是 Oracle SOA 产品管理团队中的一员,负责电子商务策略。他从企业以及 IT 方面提出了多个解决合规性、安全性、可视性、可伸缩性以及标准的方法。企业到企业 (B2B) 标准、最佳实践以及完善的端到端集成 (ESB, BPM, B2B, BAM) 是他的关注点。自 1996 年至今,他多次在国际以及国内活动中通过业务和技术白皮书、实际操作研讨会以及演示文稿来介绍新产品和技术,被公认为电子商务领域内的 Oracle 主题专家。
|