架构师:SOA
   下载
 Oracle SOA 套件(包括 Oracle ESB)
 项目文件
 
   标签
soa, java, 全部
 


面向服务的环境中的发票处理

探究使用 Oracle 企业服务总线逐步实现的流程集成情形。

作者:Ronald van Luttikhuizen

2008 年 3 月发布

Foo Inc. 是一家电话公司。由于新立法出台、客户需求增加、兼并以及竞争加剧,最近几年来该公司的利润逐渐下降。Foo 聘请了业务咨询公司“U-Build & We-Advise Inc.”来帮助改变这种局面。审计结果表明更好的业务-IT 一致性可以通过形成更灵活的业务和更灵活的 IT 来解决问题。此外,该报告还指出基于面向服务的体系结构 (SOA) 的体系结构可以实现这些目标。

咨询公司决定实现 SOA,而上述企业体系结构将用于建立和简化该过程。组建了一个直接向 Foo 公司层报告的企业体系结构小组。为避免成为脱离实际的象牙塔和产生不必要的书面工作,该小组决定按需构建企业体系结构模型,以尽早产生切实的效果。使用的方法是中间会合:在以自上而下方式构建业务流程模型的同时,编制所需服务和已提供服务的清单。

在项目早期,开始进行概念验证 — 该过程不仅是为了适应新的 SOA 系列技术产品,还是为了获得 Foo 的持怀疑态度的员工的信任。首先处理无效和有问题的 活动。在本例中,涉及的问题是 Foo 的消费电子产品首选供应商 Acme Inc. 的发票处理。这些产品用于促销活动。这些发票的处理容易出错,因为它们都是通过传真发送,然后进行人工处理。结果,Acme 非常愿意配合该项目,因为这可以降低两个公司的成本。

这一生态系统的概念是服务支持的基础之一,在该生态系统中,组织基于相互的利益互相帮助。

体系结构

从业务角度而言,发票处理是用于“购买-付款”(采购)业务流程等用途的一项服务。下面的业务流程建模标注 (BPMN) 图描述了该流程。

图 1“购买-付款”业务流程

如图所示,该流程包括以下步骤:

  1. Foo 员工在内部提出某些产品的购买请求。
  2. 向首选供应商下定单。
  3. 收到产品后,向供应商付款并通知请求者。

“向供应商付款”活动本身是一个子流程,下面对此进行描述。

图 2:“向供应商付款”子流程

该流程在收到发票后启动。然后自动验证发票。如果发票有效,则对该发票进行付款。否则,启动人工流程人工处理该发票。

如图所示,“向供应商付款”子流程利用服务来接收发票。如果是 Acme 发票,则需要一个“接收 Acme 发票”服务。

如果逐层深入到这一级别的服务设计和实施,则跨越了流程和技术体系结构之间的边界。该图没有使用 BPMN,而使用了一种更具技术性的建模标准,即统一建模语言 (UML)。

下面的 UML 活动图构建了“接收 Acme 发票”服务行为的模型。

图 3“接收 Acme 发票”服务

如果更具体地考虑发票服务,我们可以定义以下操作:

  • 阅读来自 Acme Inc. 的包含发票信息的文件并进行归档。
  • 将发票数据由 Acme 的格式转换为 Foo 的标准格式。
  • 将转换后的数据插入 Foo 的发票数据库中。
  • 与此同时,发布一个事件表明已收到来自 Acme 的新发票。对此类事件感兴趣的每个服务和/或流程可以订阅该事件。这促进了松散耦合和异步性,从而形成事件驱动的体系结构 (EDA)。(参见 Lucas Jellema 的文章“通过企业服务总线构建事件驱动的体系结构”了解关于实现 EDA 的更多信息。)

活动图分为特定于 Acme 的部分(从启动活动到转换活动)和通用部分(适用于所有传入发票类型)。这促进了设计时和运行时的重用。

为什么选择 SOA?

尽管 SOA 与所有新范例一样不是通用的灵丹妙药,但是在合适的情况下正确使用 SOA 仍然能提供很大的好处。本例反映了服务支持提供的某些承诺:

  • 业务-IT 一致性和业务价值
    通过将业务流程作为服务开发的起点,Foo 确保了交付的软件具有具体、直接的业务价值,并可以轻松追溯到业务及其流程。通过使用各级别(业务流程-子流程-服务-实施)的相应视图和图表,业务和 IT 相关人员可以清楚地了解体系结构。
  • 灵活性和敏捷性
    服务通过明确的合约(即,接口)将功能封装为构建块,无需用户了解实施细节。只要合约不变,就可以轻松替换某个服务而不会影响相关的业务流程。具体来说,如果 Foo 有更好的服务来处理发票,可以轻松将其插入以替换现有的服务。此外,如果底层实现发生变化(例如,通过不让数据在数据库中永久保存而使其成为流程实例的一部分),也只会对该服务有影响。
  • 可重用性
    通过将服务定义为流程构建块并使用开放标准来简化连接,可以实现运行时可重用性。具体来说,同一发票服务还可以在其他流程中轻松使用和调用。

为什么选择 ESB?

如本文开头所述,发票处理服务将使用 Oracle ESB 实现。Oracle ESB 可以简化基于开放标准(XPath、XSLT、SOAP、JMS、JCA 等)的 SOA 和 EDA 内的较多低级服务的实现。ESB 尤为适用于虚拟化、路由和数据转换,从而可以将这些过程与业务逻辑和流程的设计、实现和执行(在 Oracle 系列产品中通常通过 BPA 和 BPEL 工具实现)分离开来。在本例中,我们主要需要适配器、转换和路由功能,而不是业务和流程逻辑。

下图描述了一个全面的、高级 Oracle SOA 平台中以前已命名的组件的情况。

图 4 Oracle SOA 平台

实现

就技术观点而言,发票处理不是完全直接实现的,本文的剩余部分将列出让该过程正常运转所需的特殊步骤。简而言之,包括以下步骤:

  • 使用入站文件适配器读取文件
  • 使用路由服务和 XSL 路由和转换发票数据
  • 使用数据库适配器和数据库序列使数据永久保存在主从表中

事件发布不在本文的讨论范围内。

首先讨论实现。注意,所有资料来源都可在项目文件 zip 中找到。

准备安装:Oracle 数据库、Oracle SOA 套件和 Oracle JDeveloper

随附的安装指南中对准备安装进行了说明。

安装和配置过程中需要注意的事项包括:

  • 知道什么设置存储在什么地方,这一点很重要。为说明这一点,我们将查看与数据库相关的配置。全局信息于 Oracle 应用服务器级别在连接工厂设置中配置:连接设置、用户名和口令、XA 支持(全局事务)、序列使用等。而特定于映射(表专用)的设置则使用配置文件在 ESB 项目内配置:数据库序列名称、是否缓存特定表的数据等。知道这一点使得错误修复更加简单。
  • 注意您在适配器配置过程中指定的 JNDI 名称。这些值必需与稍后在 JDeveloper 中指定的值一致。如果不一致,将在运行时创建使用默认值的新适配器连接工厂。例如,这意味着数据库适配器 会使用原生序列。
  • 安装期间,某些适配器连接工厂(如 JMS 适配器)的口令默认为 welcome1,而非 oc4jadmin 口令。如果您的 oc4jadmin 口令不是 welcome1,确保更改为该口令。
  • 与原生数据源不同,托管数据源支持全局事务。配置数据库适配器连接工厂时,配置的是 xADataSourceName 而非 dataSourceName

ESB 项目、系统和服务组

既然基础架构安装已完成,我们可以真正开始构建处理 Acme 发票的 ESB 流。

  1. 在 Oracle JDeveloper 中,创建一个新的应用程序工作区以放置您的应用程序。在 Applications Navigator 中,右键单击 Applications。 选择 New Application… 并输入 InvoiceDe mo 作为应用程序名称。接受默认设置并单击 OK 创建应用程序。在 Create Project 对话框中选择 Cancel

    图 5 在 Oracle JDeveloper 中创建新应用程序

  2. Applications Navigator 中,右键单击新创建的应用程序并选择 New Project…。从 New Gallery 对话框中选择 General → Projects → ESB Project。输入 InvoiceESB 作为项目名称,接受所有其他默认设置,然后单击 OK。Oracle JDeveloper 将新建一个包含一个 jpr 文件和一个 esb 文件的 ESB 项目。该 esb 文件名为 InvoiceESB.esb,将自动在 ESB Designer 中打开。

    图 6 在 Oracle JDeveloper 中新建 ESB 项目

    下一步是在我们的 ESB 项目中构建以后的服务。为此,将使用系统和服务组。系统是必需的顶级组织单位,服务组是可选的子组织单位。这意味着某个服务要么是另一个服务组的一部分,要么直接属于某个系统。

    系统表示单个应用程序、应用程序代理或技术系统。在本例中,使用 ESB 系统将我们的企业分成“Finance”或“Customers”等功能域。

    服务组可用于进一步组织与 Java 程序包或文件系统目录十分相似的服务。服务组绑定了一组相关的服务。

  3. 单击 ESB Designer 顶部的 Create System/Group 图标。这将打开 Create ESB System or Service Group 对话框。选择 System,输入 Finance 作为名称,还可以添加描述。单击 OK 创建新的 ESB 系统定义。

    图 7 Oracle JDeveloper 的 ESB Designer 中的 Create System/Service Group 选项

    图 8 在 Oracle JDeveloper 中创建 ESB 系统“Finance”

  4. 再次打开 Create ESB System or Service Group 对话框。这次选择 Service Group。这将显示另一个选项,允许您选择新的服务组所属的系统。如果容纳系统尚未设置为 Finance,则通过单击手电筒图标进行设置。这将打开 ESB Service Group Browser

    图 9 Oracle JDeveloper 中的 ESB Service Group Browser

    选择在前面的步骤中创建的系统 Finance 并单击 OK。返回 Create ESB System or Service Group 对话框,输入 Invoice 作为名称,可以提供一个描述,然后单击 OK 创建新的服务组。

    图 10 在 Oracle JDeveloper 中创建“Invoice”服务组作为“Finance”系统的一部分

现在您已经定义了将在其中部署 ESB 项目的结构。结果是,Finance.esbsys 和 Finance_Invoice.esbgrp 文件已添加到该项目中。

文件适配器服务

现在该创建实际的服务和适配器了。由于所有流经 ESB 的数据都是 XML 格式,因此我们首先需要创建一个描述 Acme 发票数据(即进入 ESB 流的数据)的 XML 模式。

  1. 在 InvoiceESB 项目目录中创建一个 public_html 目录并将 AcmeInvoice.xsd(位于 zip 文件中)复制到该目录。默认情况下,XML 文件存储在 ESB 项目的根目录中,但是为了便于概览,我们将这些文件放到一个单独的目录中。
  2. 创建一个将轮询新的 Acme 发票文件的入站文件适配器。确保 ESB Designer 已打开。从右侧的 Component Palette 中选择 Adapter Services,并将 File Adapter 拖到 ESB Designer 窗口中。这将打开 Create File Adapter Service 对话框。

    图 11 创建入站文件适配器

    输入 ReadAcmeInvoice 作为服务名称,并可以选择添加一个描述。确保选择 Finance.Invoice 作为容纳 System/Group。如果尚未选择,使用手电筒图标打开 ESB Systems/Groups 浏览器并选择 Finance → Invoice

  3. 单击 WSDL File 旁边的 Configure adapter service wsdl 图标打开 Adapter Configuration Wizard,继续适配器服务的配置。

    12 传入文件适配器配置向导的第 3 步

    在本向导中,使用以下设置:

    1. 第 1 步:接受默认值。
    2. 第 2 步:Operation Type:Read File。
    3. 第 2 步:Operation Name:ReadInvoice。
    4. 第 3 步:Directory Names are Specified as:Logical Name。
    5. 第 3 步:Directory for Incoming Files (logical name):acmeInvoiceIn。
    6. 第 3 步:选择 Archive processed files
    7. 第 3 步:Archive Directory for Processed Files (logical name):acmeInvoiceArchive。
    8. 第 3 步:选择 Delete files after successful retrieval
    9. 第 4 步:选择 File Wildcards 作为名称模式规范。
    10. 第 4 步:Include Files with Name Pattern:AcmeInvoice_*.xml。
    11. 第 5 步:选择轮询频率为 5 秒,最低文件年龄为 5 秒。
    12. 第 6 步:单击 browse 并选择 Project Schema Files → AcmeInvoice.xsd → invoice。注意,这是上一步中的模式。稍后用于启动和测试 ESB 流的的示例输入文件必须是针对该 XSD 元素有效的。

    13 为入站 Acme 发票选择 XSD 元素

    针对该入站文件适配器的路由服务名为 ReadAcmeInvoice_RS,在文件适配器向导完成后将自动添加到项目中。该适配器提供路由和转换功能。

    图 14 创建入站文件适配器服务后的 ESB Designer

    但是在继续路由服务之前,我们将首先通过提供逻辑名称的值来完成文件适配器的配置:

  4. ESB Designer 中,双击文件适配器打开它。展开 Endpoint Properties 并使用绿色的 + 图标添加一个值。在 Endpoint Property Chooser 对话框中,选择 acmeInvoiceIn。在值列中,输入一个您文件系统上的位置,将从该位置读取示例输入文件,例如 C:/Temp/Acme。这必须是一个现有目录。

    图 15 Endpoint Property Chooser 对话框

  5. 重复该步骤为 acmeInvoiceArchive 提供一个值,例如 C:/Temp/Acme/Archive。处理后的文件将存储在该目录中。

    图 16 为入站文件适配器服务属性提供了值后的路由服务

    您已经完成了为读取 Acme 发票文件进行的适配器配置。单击 Save All 图标保存所有文件。

数据库适配器服务

接下来创建一个将发票数据插入主从表中的数据库适配器。

  1. 确保 ESB Designer 已打开。从右侧的 Component Palette 中选择 Adapter Services,并将 Database Adapter 拖到 ESB Designer 窗口中。这将打开 Create Database Adapter Service 对话框。
  2. 在该窗口中,输入 InsertAcmeInvoice 作为服务名称并可以选择添加一个描述。确保选择 Finance.Invoice 作为容纳 System/Group。如果尚未选择,使用手电筒图标选择相应的系统和服务组。

    图 17 创建数据库适配器

  3. 单击 WSDL File 旁边的 Configure adapter service wsdl 图标打开 Adapter Configuration Wizard,继续适配器服务的配置。

    图 18 数据库适配器配置向导的第 2 步

    图 19 数据库适配器配置向导的第 3 步

    图 20 导入主从发票表

    在本向导中,使用以下设置:

    1. 第 1 步:接受默认值。
    2. 第 2 步:在 Connection 下拉列表中,选择您先前创建的 invoiceDemo 数据库连接。
    3. 第 2 步:确保 JNDI 名称与您在 Oracle 应用服务器数据库适配器配置过程中指定的 JNDI 位置完全匹配,应该为 eis/DB/invoiceDemo。
    4. 第 3 步:选择 Perform an Operation on a Table 作为操作类型。选择 Insert Only 并取消选择所有其他选项。
    5. 第 4 步:单击 Import Tables… 打开一个对话框,您可以从中选择发票表。单击 Query 概览 INVOICE_DEMO 模式中的所有表(应该只有两个表)。选择 INVOICESINVOICE_LINES 表并将它们移到所选的小部件中。返回 Select table 对话框,选择 INVOICES 作为根数据库表,因为这是主表。
    6. 第 5 步:主从关系应在该窗口中以 INVOICESINVOICE_LINES 之间的关系显示:一对一和一对多关系。单击 NextFinish 完成该向导。

    使用数据库序列还需要一些配置后的步骤。由于数据库适配器是使用 Oracle TopLink 实现的,因此我们需要配置 TopLink 特定设置。该适配器使用 Oracle TopLink 的 XML-对象 (XO) 和对象-关系 (OR) 映射功能将 XML 转换为 SQL 语句。配置了以下序列设置之后,数据库适配器将在将数据插入发票表时自动在运行时填充主键和外键。

  4. Applications Navigator 中导航到 Application Sources → TopLink → InsertAcmeInvoice,选择 InsertAcmeInvoice TopLink 映射。双击该映射将其打开,更改以下值:
    1. 选择 Use Native Sequencing
    2. Preallocation Size 设置为 1,该值必须与数据库序列的 increment by 大小相同。

    图 21 修改 Oracle TopLink 映射以启用原生序列

  5. Structure 窗口中,展开 InsertAcmeInvoice 节点,选择 Invoices 描述符。更改以下内容:
    1. 选择 Use Sequencing
    2. 在序列 Name 域中输入 INVOICES_SEQ
    3. TableField 值应该为 INVOICES 表及其主键 ID。

    图 22 为 Invoices TopLink 描述符配置序列设置

  6. 针对 InvoiceLines 描述符重复上述步骤。这次,输入 INVOICE_LINES_SEQ 作为序列名称。

    图 23 为 InvoiceLines TopLink 描述符配置序列设置

  7. 单击 Save All 保存 ESB 项目中的所有文件。

    如果您通过在 Applications Navigator 中右键单击该项目并选择 Rebuild 来编译它,您可能会收到 TopLink found problems in InsertAcmeInvoice 警告。要消除该警告,可以在 Structure 窗口中展开 InsertAcmeInvoice 映射的 Invoices 描述符,选择 invoiceLinesCollection 映射并取消选择 Use Method Accessing

    图 24 取消选择“Use Method Accessing”选项

    如果您重新构建 ESB 项目,该警告将消除。

重要事项
有时可能无法正确生成 TopLink 序列信息。这可能导致运行时错误,表明没有创建主键。

要验证是否是这种情况,使用外部文本编辑器打开位于项目的根目录中的 InsertAcmeInvoice_toplink_mappings.xml 文件。搜索 <toplink:sequencing> 元素。该元素应该出现两次 — 每个发票描述符/表(INVOICES 和 INVOICE_LINES)各一次。如果未找到此类元素,执行以下操作:

  1. 打开位于 src/META-INF 目录中的 InsertAcmeInvoice.xml 文件。
  2. 搜索 <opm:alias> Invoices</opm:alias> 元素内的 toplink:sequencing 元素。该元素位于 toplink:descriptor-type 和 toplink:caching 元素之间。
  3. 将整个 toplink:sequencing 元素从 InsertAcmeInvoice.xml 文件复制到 InsertAcmeInvoice_toplink_mappings.xml 文件中的同一位置。
  4. 针对 <opm:alias> InvoiceLines</opm:alias> 元素内的 toplink:sequencing 元素重复该步骤。
  5. 保存修改后的 InsertAcmeInvoice_toplink_mappings.xml 文件。


<opm:alias>InvoiceLines</opm:alias>

<toplink:descriptor-type>independent</toplink:descriptor-type>
<toplink:sequencing>
  <toplink:sequence-name>INVOICE_LINES_SEQ</toplink:sequence-name>
  <toplink:sequence-field table="INVOICE_LINES" name="ID" xsi:type="opm:column"/>
</toplink:sequencing>
<toplink:caching>

<opm:alias>Invoices</opm:alias>

<toplink:descriptor-type>independent</toplink:descriptor-type>
<toplink:sequencing>
  <toplink:sequence-name>INVOICES_SEQ</toplink:sequence-name>
  <toplink:sequence-field table="INVOICES" name="ID" xsi:type="opm:column"/>
</toplink:sequencing>

路由服务

前面已经提过,Oracle JDeveloper 自动为入站文件适配器创建了一个路由服务。但是,该路由服务尚未包含任何路由或转换逻辑。下面我们创建该功能以将入站文件适配器连接到出站数据库适配器。

  1. ESB Designer 中双击 ReadAcmeInvoice_RS 将其打开。该路由服务只有一个 ReadInvoice 操作,没有路由规则。(注意,默认选择 Invocable from an external service 选项。这意味着在 ESB 项目部署期间,将创建一个如果执行将调用该路由服务的 Web 服务。如果导航到在其中部署 ESB 的 OC4J 实例的 Web Services 选项卡,将看到该 Web 服务在 Oracle Application Server Enterprise Manager 中列出。该特性可用于测试目的。如果不需要该路由服务可从外部调用,可以取消选择 Invocable from an external service 选项。)
  2. 单击 ReadInvoice 操作右侧的绿色 + 图标添加一个路由规则。 Browse Target Service Operation 对话框打开。

    图 25 无 ReadInvoice 操作的路由规则的路由服务

  3. 选择我们先前创建的数据库适配器的 insert 服务作为目标。

    图 26 选择 InsertAcmeInvoice 适配器的 insert 服务作为目标服务

    Routing Service 窗口表明在文件适配器读取发票文件后立即调用 insert 服务。

    图 27 包括 ReadInvoice 操作的一个路由规则的路由服务

    您需要创建一个转换规则,因为入站发票文件的 XML 格式不是数据库适配器期望的 XML 格式。

  4. 单击 <<Transformation Map>> 旁边的 XSL mapping 图标创建一个转换 (XSL) 文件。在对话框中,选择 Create New Mapper File,接受默认名称 invoice_To_InvoicesCollection.xsl,然后单击 OK。这将打开 XSLT mapper 工具。您将看到位于左侧的 Acme XML 格式以及位于右侧的 Oracle TopLink 数据库 XML 格式。

    图 28 Oracle JDeveloper 中的 XSLT 映射器工具

    利用 XSLT 映射器,您可以通过允许拖放操作以可视方式定义从输入元素到输出元素的映射。该映射器还为(部分)同名的输入和输出元素提供自动完成功能。

  5. 通过将 imp1:invoice 元素从左侧移到右侧的 top:Invoices 元素上,试用自动完成功能。 Auto Map Preferences 对话框出现。

    图 29 通过在 Oracle JDeveloper 中使用 XSLT 映射器工具来自动映射输入和输出 XML 文件

    保留映射器的默认设置,单击 OK。如您所见,几乎所有元素都已映射。只需进行以下两项修改:

    1. 删除从 /imp1:invoice/imp1:invoiceLines/imp1:invoiceLine/imp1:productIdtop:InvoicesCollection/top:Invoices/top:invoiceLinesCollection/top:InvoiceLines/top:id 的映射,因为 INVOICE_LINES 的 ID 列由数据库序列自动填充。通过在 Mapper 窗口中选择该映射并删除它,可以移除该映射。
    2. 为 top:supplierName 提供一个值,方法是,选择它并单击右键,然后选择 Set Text…。输入 Acme Inc. 作为值。

    生成的映射应如下所示:

    图 30 最终的映射

该项目已完成并且可以部署到 ESB 服务器,然后通过示例 Acme 发票文件测试它是否正常工作。

部署

通过在 Applications Navigator 中右键单击 ESB 项目并选择 Register with ESB,将其部署到 Oracle 应用服务器。Oracle JDeveloper 将通知您服务器上创建了 Finance 系统、 Invoice 服务组以及适配器和路由服务。

图 31 在 Oracle ESB 中注册 ESB 项目

图 32 注册成功

导航到 ESB Control 查看注册的 ESB 流。选择 Start → Programs → Oracle – <SOA 套件实例名> → Oracle ESB → ESB Console。这将在浏览器窗口中打开 ESB Control

图 33 Oracle 应用服务器 ESB 控制台

Services 概述中,逐层深入以查看 Finance 系统、 Invoice 服务组以及您刚刚创建和部署的服务。(ESB 控制台在 Oracle 企业服务总线开发人员指南 中进行了说明。)

测试

通过将 zip 文件的 InvoiceDemo/InvoiceESB/resources/input 目录中的 AcmeInvoice_20071230.xml 测试输入文件复制到指定为入站文件适配器的 acmeInvoiceIn 端点属性的入站目录中,可以启动和测试 ESB 流。

结果是,XML 文件中的 Acme 发票数据插入到发票数据库表中。在数据库中查看,验证这一点。注意,主键和外键已自动填充。

此外,在 ESB 控制台中查看已完成的实例。

图 34 ESB 流的一个实例已成功完成

您已经使用示例输入文件设计并实施了一个实际的集成情形,并进行了测试。

结论

根据实际的情形,本文演示了如何使用企业体系结构从企业的角度识别所需的服务并为其建模。然后可以使用这些服务组合和执行流程。该方法保证了服务可以提供具体的业务价值并可以重复使用。

通过本文,您已经使用 Oracle ESB 实现了这样一个服务,方法是,将多个已经可用的适配器和路由服务组合到一个用于处理发票的流中。这是基于 Web 服务等开放标准以及其他各种 Java 和 XML 相关标准实现的。

以后只需扩展该 ESB 流即可添加服务来读取其他供应商的发票。如果已经有用于永久保存数据和发布事件的功能,只需添加入站和转换服务。

后续步骤

在我们的案例研究中,我们已经通过实现另一个用于处理所有新发票而不只是 Acme 发票的服务,进一步将该发票服务集成到整个 SOA 环境中。该服务订阅读取发票服务发布的新发票事件、验证发票并根据结果自动向供应商付款或启动一个人工任务。该流对所有类型的传入发票都通用。特定于供应商的逻辑是验证发票服务的一部分。因此上述情形实现“向供应商付款”子流程的剩余部分,如图 2 所示。

其他一些需要记住的常见问题:

  • 通过添加错误处理功能提高强健性。
  • 使用 Oracle ESB 的自定义 Ant 任务自动部署 ESB 流。
  • 考虑高可用性、集群和安全性。
  • 在 ESB 控制台中完成 Finance 的 ESB 系统定义,提供 Notification Details、Virtual Host、Port 等的值。

Ronald van Luttikhuizen (ronald.vanluttikhuizen@approach-alliance.com) 是 Approach Alliance ( www.approach-alliance.com) 的一名架构师,这家公司总部设在荷兰,主要从事 SOA 和业务智能方面的信息和通信技术咨询。