BPEL 面向 WLI 用户的 SOA 套件概要

比较:WLI 文件控件和 Oracle 文件适配器

作者:Daniel Amadei 和 Heidi Buelow

面向 WLI 用户的 SOA 套件概要系列的这一部分将介绍与 WebLogic Integration 的文件控件功能相对应的 Oracle BPEL 流程管理器功能。

2009 年 5 月发表

本文相关下载:
 Oracle SOA 套件

本文内容:

[第 1 页] [ 第 2 页] [ 第 3 页] [ 第 4 页]

简介

当今,IT 最基本的一项内容就是文件。文件无处不在!从移动设备到企业服务器,再到个人计算机,您时刻都会看到文件。

尤其在与外部或原有应用程序集成时,在某一时间您肯定有读取、写入或操作文件的需求。

操作文件是一项容易出错(每次读取文件后都让文件保持打开状态,而您以后才发现)的重复性任务(无论您执行什么操作,步骤都基本相同)。为了更轻松地处理文件,集成工具已经创建了解决方案,从而添加了间接性并消除了开发人员在处理文件时需要执行的一些繁琐任务。

本文的目的是介绍 Oracle WebLogic Integration (WLI) 和 Oracle SOA 套件(特别是 BPEL 流程管理器 (BPEL PM))如何处理文件,并让您更轻松地执行文件操作。本文由两个介绍部分组成,概述了这两种与文件处理相关的产品所采用的技术。对于 WLI,我们将深入探讨文件控件的概念,它是一个负责同步操作文件的组件。对于 BPEL PM 也是如此,我们将介绍它的文件适配器及相关概念。

然后,在理论说明之后,我们将转向实践,使用这两种工具实现三个用例。有关 BPEL PM 的更多信息,请参阅 Oracle BPEL 流程管理器

WLI 文件控件

了解此控件及其在 WLI 体系结构中的作用

控件是一种组件,其主要用途是简化资源访问并以统一的方式访问资源。通过用于扩展基本控件接口的界面,您可以自定义控件并在 WLI 流程内使用它。这样,即可以 Java 接口的形式提供自定义版本的控件,并在后台创建实现。

控件的实例化是另一个关注点。由于您无法访问控件的实现类,因此通过实现类实例化控件毫无意义。这就是为什么通过相关性注入实现控件实例化的原因,这样可减少流程和控件实现之间的耦合。

控件公开为普通的旧式 Java 接口,并通过标准 Java 方法实现其功能。如果开发人员未自定义方法,则仅从父接口继承方法。否则,会根据您在创建控制文件时设定的配置生成方法。要使用方法,只需从文件控件的可用方法列表中将其拖放到流程中要执行此方法的位置。然后,您可以分别配置此方法预期或返回的必要的发送或接收值。

下图显示了将 read 方法从控件拖放到流程的过程。绿色复选框表示方法已完全配置。

process.png

通过控件操作文件

正如您猜测的那样,可以在 WLI 中以控件的形式进行文件操作:即,文件控件。当您创建文件控件时,需要自定义以下信息:

  • 目录
  • 文件名或文件名筛选器
  • 数据类型
  • 编码(将字符串或 XML 作为数据类型处理时使用)

在处理大型文件时,您可以指定一些分隔符,这样不会一次性将文件全部加载到内存中。下图显示了允许您在创建文件控件时输入这些参数的屏幕。

control_config3.png

将文件控件添加到流程时生成的接口将从 com.bea.control.FileControl 继承以下方法(有些方法已省略,但您可以在 WLI 文档和相应的 javadoc 中找到它们)。

  • copy(String fileName):将当前文件复制到指定文件名。
  • delete():删除当前文件。
  • rename(String fileName):将当前文件重命名为指定文件名。
  • FileControlFileListDocument getFiles():针对与当前目录中指定文件掩码相匹配的文件对象返回迭代器。
  • FileControlPropertiesDocument getProperties():获取控件的动态属性
  • setProperties(FileControlPropertiesDocument xmlProp):设置控件的动态属性

您可能已经注意到,最后两种方法使用了属性的概念。这些属性是 XMLBeans 类的实例,通过打包在 WLI 中的 XSD 生成。通过使用属性类,您可以在运行时自定义控件的行为。例如,您将能够根据流程的实例变量值更改要放置文件的目录。根据您在创建控件时提供的自定义参数(尤其是数据类型),可以创建以下方法并将其添加到您的 Java 接口:

  • FileControlPropertiesDocument write(<数据类型>):根据您选择的数据类型,将内容写入文件
  • <数据类型> read():根据数据类型,从文件中读取内容
  • append(<数据类型>):将内容追加到文件,当数据类型为 XML 时不可用

此时,您已经知道使用文件控件可以轻松地进行以下操作:

  1. 写入、读取数据以及将数据追加到文件
  2. 操作文件:复制、重命名以及删除
  3. 列出目录的内容。

可以写入文件以及从文件中读取的数据类型包括:

  • RawData(二进制)
  • 字符串
  • XML(通过读取和写入 XML,文件控件可以使用 XML Bean 绑定框架处理 XML 内容与其 Java 表示之间的相互转换)。

访问文件和目录的方式:

  • 在 Windows 和 Unix 系统本地访问;
  • 以 FTP、SFTP 或 UNC 的形式通过网络访问。
您可能已经注意到,文件控件负责同步操作文件。如果您要执行某种文件轮询,应该引用 WLI 事件生成器,这是 SOA 套件系列中另一篇文章的主题。

Oracle 文件适配器

Oracle 应用服务器文件适配器简介

Oracle 应用服务器适配器有三种类型:技术、打包应用程序以及原有类型。Oracle 文件适配器是技术适配器。技术适配器基于 J2EE 连接器体系结构 (J2CA) 1.5 标准,并在 BPEL 流程管理器所在的 J2EE 容器中部署为资源适配器。

适配器会根据设计时配置的适配器元数据实现本机 API 与标准 XML 之间的相互转换。适配器使用可提供图形用户界面 (GUI) 的设计时工具来配置和管理适配器,以便快速实施和部署。

BPELAdapterArch_smaller.png

入站和出站交互

文件适配器在入站和出站方向交换文件。根据方向,文件适配器会执行一组不同的任务。

适配器支持事件通知服务,此为异步通信范例。在 J2CA 术语中,此类型的服务也称为入站交互。在设计时,J2CA 入站交互在 WSDL 文件中捕获。对于发送到 Oracle BPEL 流程管理器的入站文件,文件适配器会执行以下操作:

  1. 轮询文件系统以查找匹配项
  2. 根据在设计时定义的原生模式 (NXSD) 读取并转换文件内容
  3. 将已转换的内容发布为 XML 消息。

适配器支持同步请求-响应服务。在 J2CA 术语中,此类型的服务也称为出站交互。BPEL 流程管理器使用 WSIF 技术启动资源适配器的请求-响应服务。WSIF 用于调用 Web 服务并将 Web 服务定义的抽象部分与物理绑定(传输和协议)分开,以生成面向服务的体系结构 (SOA)。对于从 Oracle BPEL 流程管理器发出的出站文件,文件适配器会执行以下操作:

  1. 从 BPEL PM 接收消息
  2. 按照设计时的指定,设置 XML 内容的格式
  3. 生成输出文件可根据以下条件创建输出文件:所用时间、文件大小以及消息数量。您还可以为输出文件指定这些条件的组合。

文件格式

文件适配器可以读取和写入以下文件格式,并在设计时和运行时使用适配器转换器组件:

  • XML(基于 XSD 和 DTD)
  • 带分隔符的
  • 固定位置的
  • 二进制数据
  • COBOL Copybook 数据
  • 二进制(例如 JPG)

通过转换器,文件适配器可将各种格式的原生数据转换为 XML。原生数据可以是简单数据(仅为平面结构)或复杂数据(具有父子关系)。转换器可以处理 XML 以及非 XML(原生)格式的数据。

适配器统计信息

在 BPEL 流程管理器 10.1.3 中,几个技术适配器(例如文件、JMS 以及数据库)针对它们处理的每个入站或出站消息收集并发布统计信息。统计信息分为不同类别和不同任务。以下是如何在出站流程中对统计信息进行分类的一个示例:

  • 适配器预处理
  • 准备交互规范
  • 适配器处理
  • 设置可调用语句
  • 调用数据库
  • 分析结果
  • 适配器后处理

可以在 BPEL 控制台中提供 BPEL 引擎统计信息的页面查看适配器统计信息。以下是在 BPEL 控制台查看适配器统计信息的步骤:

  1. 在前面的 BPEL PM 控制台页面中,单击 Manage BPEL Domain 链接。
  2. 在下一页上,单击 Adapter Statistics 链接。

这将显示所有当前活动的入站和出站适配器交互列表,以及每个适配器执行的各个步骤的平均执行时间。

要重置统计信息收集,请单击 Clear Statistics 链接。

有关更多信息,请参阅 Oracle 文件适配器用户指南

用例示例

此用例示例分为三部分:

  1. 将文件内容作为字符串读取
  2. 创建使用一个 XSD 接收股票报价、转换数据以及将内容作为 XML 写入文件的流程
  3. 创建读取在第 2 部分中写入的文件以及将此文件转换为 CSV 文件并写入 FTP 目录的流程。

实现这些用例所需的示例文件(模式、输入数据等)都包含在 CompareWLI_BPEL.zip 中。本文通篇引用此示例文件的文件夹。此 zip 还包含使用这些说明构建的项目。

在 WLI 中实现用例

使用 WLI 从文件中读取纯字符串

创建流程应用程序

为了能够执行本文中包含的 WLI 示例,您必须先创建流程应用程序并将其部署到 WLI 域。有关域创建过程,请参阅 使用域配置向导

要创建流程应用程序,只需执行以下步骤:

  1. 访问 Oracle Workshop for WebLogic
  2. 右键单击 Package Explorer 的空白区域并选择 New | Project
  3. New Project 屏幕中,展开 WebLogic Integration 并选择 Process Application
  4. 单击 Next
  5. 输入以下内容:
    • EAR Project NameFCTLApp
    • Web Project NameFCTLAppWeb
    • Utility Project NameFCTLAppUtil
    • 选中复选框 Add Weblogic Integration System and Control Schemas to Utility Project
  6. 单击 Finish

将文件内容作为字符串读取

在第一步中,我们将文件内容作为字符串读取,并且仅将其打印到标准输出。

确保您在 Process 图内操作。展开 FCTLAppWeb、src 并右键单击 process 包。选择 New、Process,如下所示。

new_process.png

输入 GetFileContentAsString 作为流程名称,并使用 useCase01 补充包名称,使其成为 processes.useCase01。保留其他选项不变,单击 Finish。将显示用于选择流程开始事件的屏幕,类似于以下屏幕。

process_screen1.png

双击 白色方块,为您新近创建的流程选择开始事件。将显示以下屏幕。选择 Invoked synchronously via a Client Request with Return 并单击 Close。执行此操作将导致流程同步,并强制向用户返回信息。

select_start_event.png

将更新流程。右键单击新组并选择 Open Return Builder。将显示以下屏幕。单击 Select... 按钮。

configure_return.png

现在,您将能够为流程配置返回设置。在 Parameter Name 中,输入 fileContent;这将是此流程的返回参数的名称。在 Type Name 中,我们将选择返回 String。您可以单击 Browse 亲自查找 String 类,或者单击 Simple 选项卡并选择列表末尾的 String。单击 OK 之后才能够单击 Send Data,这将向 WLI 通知要将什么内容作为刚创建的 fileContent 参数发送。

Select variables to assign 域中,选择 Create new variable...,如下图所示。这将此变量中存储的值作为响应发送到此流程的用户,因此我们必须在执行期间将某一值存储在此变量中。您将很快看到如何将值存储到此变量中。

create_var_send_data.png

将变量命名为 fileContent 并单击 OK。单击 Close 按钮。将在 Client Request with Return 组的右上方出现一个绿色复选框,表明它已配置并且没有错误。

此时,您的流程将接收不含输入数据的请求,并以字符串的形式返回变量 fileContent 的内容。现在,我们应该继续读取文件并将其内容存储在 fileContent 变量中,以便向用户返回此文件。

Data Palette(位于 WorkSpace 屏幕的右下方)上,单击箭头并选择 Integration Controls | File,如下所示。

add_file_control.png

将显示 Insert Control:File 屏幕。保持 fileControl 作为 Field Name。(这将是 java 文件内表示控件实例的属性的名称。)单击 Next

系统将要求您输入 Java 类名。此名称将提供给控件的 Java 接口。将其命名为 StringReaderFileControl 并单击 Next

最好将控件放在 Utility 项目内,以便控件共享并可在项目之间重用。为使本教程更加简洁,我们决定在 Web 项目内创建控件。

将显示一个屏幕,用于指定控件将访问的文件的相关信息。按以下方式输入数据并单击 Finish

insert_control_file.png

控件定义之后,就会出现在 Data Palette、Controls 部分中。您将看到 fileControl 元素,此元素可以展开,类似于下图。从列表中选择一个方法,将其拖到流程中并放在要执行此方法的位置。

control_methods.png

从列表中选择 String read() 方法,并将其放在 Client request with return 组内,如下所示:

control_dnd.png

此后,您将看到 read 节点,其右上方有一个灰显复选框。正如前面提到的那样,这表示节点仍需要进行配置,因此双击此节点。

在出现的屏幕上,选择 Receive Data,并在 Select variables to assign 中,从下拉列表中选择变量 fileContent。流程旁边将显示绿色复选框。单击 Close。流程将如下图所示:

process_finished.png