主题
面向服务的架构
比较:WLI 文件控件和 Oracle 文件适配器作者:Daniel Amadei 和 Heidi Buelow 面向 WLI 用户的 SOA 套件概要系列的这一部分将介绍与 WebLogic Integration 的文件控件功能相对应的 Oracle BPEL 流程管理器功能。2009 年 5 月发表
[ 第 1 页] [ 第 2 页] [ 第 3 页] [ 第 4 页] 了解我们在此步骤中执行的操作很重要:将 read 方法拖到流程中将会读取为文件控件指定的文件。当 read 方法返回字符串时,我们选择已经创建的变量(fileContent 变量)来存储返回内容。由于我们已经选择变量 fileContent 作为要由流程返回的变量,因此,当我们使用此变量来存储从文件中读取的内容时,将返回文件内容。
通过右键单击流程并选择 Run As, Run On Server 来执行流程。您将看到所显示的测试控制台,如下所示: 使用测试控制台,您将能够执行许多任务,包括获得流程的 WSDL 以可视化流程图、测试允许您快速测试流程的页面以及其他任务。我们将使用它测试刚创建的流程。
在 /tmp/repository 目录内创建一个名为 stringContent.txt 的文件。在此文件内输入以下文本: I will be read by WLI File Control! 通过选择 Test Form 选项卡然后单击 clientRequestWithReturn 按钮来执行此流程。在 Service Response 部分中,您将看到流程读取并返回此文件的内容,如下所示: 使用 WLI 接收 XML、转换为其他模式并写入文件在此示例中,您将接收符合 XSD 模式的 XML 文档,将其转换为其他模式,此模式表示您必须将文档转换为符合某供应商或合作伙伴所期望模式的情形。最后,我们使用 WLI 文件控件将已转换的 XML 写入文件。 确保您在 Process 透视图内操作。展开 FCTLAppWeb、src,右键单击 processes.useCase01 包并选择 New | Process。 将包的名称更改为 processes.useCase02。输入 TranslateStockProcess 作为流程的名称,保留其他选项不变,然后单击 Finish。将显示用于选择流程 开始事件的屏幕。 选择 Invoked via Client Request 作为开始事件,如下所示。 从示例文件的文件夹中,将文件 stocks.xsd 和 STOCKS_PARTNER.xsd 复制到 FCTLAppWeb 项目的 schemas 文件夹。将以 XMLBeans 类的形式解释和编译模式。编译应该立即进行,并且将在项目的类路径中提供生成的类。我们将使用在 stocks.xsd 文件中定义的 stocks 元素作为此流程的输入文档。 双击 Client Request 节点以便为流程添加输入参数。将显示以下屏幕。 单击 Add... 添加新的输入参数。将显示用于选择参数名称和类型的屏幕。在 Parameter Name 中,输入刚添加的参数的名称 stocks。对于类型选择,您可以通过单击 Browse... 手动选择,或者通过从 Simple、 XML 或 Non-XML 选项卡中选择值来从 WLI 找到的类型中进行选择。由于我们将选择的类型来自 XML,因此单击相应的选项卡。 在 XML 选项卡内,展开 FCTLAppWeb | schemas | stocks.xsd 并选择 stocks 元素。这遵循您复制到 schemas 文件夹的 XSD 文件的结构。 输入参数的配置应该如下图所示。最后,单击 OK。 现在,将作为输入参数接收的值存储在变量中,以便以后使用。单击 Receive Data 项,然后在 Select variables to assign: 中选择 Create new variable...。将显示以下屏幕。 输入 stocks 作为变量名。将从输入参数的类型中推断出类型。单击 OK。 现在,我们便拥有这样一个流程:将 XML 文档作为名为 stocks 的输入参数接收,并将其内容存储在同名 ( stocks) 的变量中。现在,将存储在 stocks 变量内的 XML 文档转换为符合合作伙伴的 XML 模式的格式。
要执行此转换,右键单击 processes.useCase02 包并选择 New | Transformation,如下所示。 将转换命名为 StockTransformation 并单击 Finish。转换将作为标准 Java 抽象类创建。 右键单击 StockTransformation.java 文件并选择 Transform | Add XQuery Transformation Method,如下所示。 这将 XQuery 转换公开为标准 Java 方法,此方法将能够作为流程流的一部分调用。
将方法命名为 transformStockToPartnerSchema,将 XQuery 文件命名为 transformStockToPartnerSchema.xq,如下所示。完成后,单击 Next。 现在该选择 源类型了。展开 FCTLAppWeb | schemas | stocks.xsd | stocks 并单击 Add。元素将移至 Selected Source Types 中,如下所示。单击 Next。 显然,现在该选择 目标类型了。展开 FCTLAppWeb | schemas | STOCKS_PARTNER.xsd | STOCKS 并单击 Add。元素将移至 Selected Target Types 中,如下所示。单击 Finish。 您应该转到 XQuery Mapper,如下所示。 将 Source 选项卡中的每个项拖到 Target 选项卡中的对应位置。结果应该类似于下图。完成映射之后,不要忘记单击 Save 按钮或按 Ctrl+S 保存您的工作。 XQuery Mapper 是一个实用程序工具,可帮助您以图形方式创建复杂转换。如上所示,您只需使用拖放操作即可创建转换。XQuery Mapper 还支持更复杂的情形(例如联接和重要转换),同时允许您通过 Source 选项卡进行源访问来保持对已生成 XQuery 的完全控制。使用 Test 选项卡测试查询也非常简单。
现在转换已经就绪,将 StockTransformation.java 文件拖到 Data Palette 内的 Controls 文件夹。这应该如下图所示,我们添加到转换中的方法应该作为控件的方法提供。 现在,将 transformStockToPartnerSchema 方法拖到 Client Request 节点下的流程流中。此时,流程应该类似于下图。 双击 transformStockToPartnerSchema 配置发送到转换方法以及从该方法接收的信息。对于 Select variables to assign 中的 Send Data 配置,选择 stocks 变量。 转到 Receive Data 部分,选择 Create new variable 并输入 partnerStocks 作为新变量名。完成后,单击 Close 完成转换节点配置。 此时,我们的 XML 格式已和合作伙伴所期望的一样。我们只需将其写入文件即可完成用例。
现在,向项目中添加文件控件。您已经在上一部分中了解了如何执行此操作,因此我们将省略大部分细节。将实例属性命名为 xmlFileControl 并单击 Next。将接口命名为 XmlFileControl 并单击 Next。如下图中所示配置控件,注意 Type of Data 应该为 XmlObject,以便强制控件使用 XML。完成后,单击 Finish。 从 xmlFileControl 可用方法列表中拖动 write 方法。在 Send Data 中,选择 partnerStocks 变量,并在 Receive Data 中创建一个名为 properties 的新变量。完成后,单击 Close。 配置 write 方法调用时,我们选择将 partnerStocks 变量写入 /tmp/repository/partnerStocks.xml 中的 XML 文件。流程已经就绪!现在将对其进行测试! 要测试流程,右键单击流程并选择 Run As | Run On Server。当显示 Test Console 时,选择 Test SOAP 选项卡。我们选择 Test SOAP 选项卡,因为通过此选项将自动生成输入 XML 负载,如下所示: 更改 SOAP body 部分中的数据,使其类似于以下 XML 文档。
<clientRequest
xmlns="http://www.openuri.org/" xmlns:stoc="http://www.oracle.com/WP/stock">
<stoc:stocks>
<!--1 or more repetitions:-->
<stoc:stock>
<stoc:symbol>ORCL</stoc:symbol>
<stoc:companyName>Oracle Corporation</stoc:companyName>
<stoc:price>18.10</stoc:price>
</stoc:stock>
</stoc:stocks>
</clientRequest>
单击 clientRequest 按钮,您将看到测试结果。单击刷新按钮,直到完成流程,然后转到 /tmp/repository 目录,查看是否已创建文件 partnerStocks.xml。此文件的内容应该类似下图。 示例已完成,正如您已经看到的那样,我们接收了一个符合某个模式 (stocks.xsd) 的 XML 文档,将其转换为另一个模式定义 (STOCKS_PARTNER.xsd)(此定义模拟将此文档发送到合作伙伴这一要求),并使用文件控件的 XmlObject 文件写入功能将其写入文件。这样,我们能够写入 XML 内容,此内容以 Java 对象(实际上是一个由 XMLBeans 编译器生成的类的实例)的形式表示。
在 WLI 中使用 FTP 接收 XML、转换为 CSV 并写入文件在此示例中,您会将为用例 2 编写的 XML 文件转换为 CSV 文件。转换之后,您将了解如何使用文件控件将文件发送到 FTP 服务器。 对于文件格式定义(在我们的示例中为 CSV),我们使用了 MFL 的概念,文件格式定义为“描述非 XML 数据的原生表示和层次结构的 XML 语言。MFL 是非 XML 数据的 XML 描述”。
对于 MFL 文件的创建,我们使用了 Format Builder 工具,这是一种帮助创建非 XML 数据表示的 GUI 工具。您可以在 此处找到有关 Format Builder 的更多信息。 在 processes.useCase03 包中创建一个名为 TransformXmlToRawDataAndWriteToFTP 的新流程。 选择开始事件为 Invoked via Client Request。 将 XmlFileControl.java 从 processes.useCase02 包拖放到 Data Palette 中的 Controls 文件夹。 此时,您将重用在用例 2 中创建的控件,但现在您将使用它读取您创建的文件。最好将控件放在 utility 项目内,以便可以在不同应用程序之间共享和重用控件。
将 read 方法拖到流程中,使其类似于下图。 双击 read 节点。选择 Receive Data 项,并选择用于创建新变量的选项。选择 STOCKS 元素(如您在用例 2 中所做的那样),如下图中所示。完成后,单击 OK 和 Close。 我们刚完成的步骤将控件的 read 操作(XMLObject 实例)的结果转换为 STOCKS 类。
我们创建了 MFL 文件以表示 CSV 文件格式。将 MFL 文件从示例文件的文件夹复制到 schemas 项目。 这将创建 MFL 在 Java 中的表示及其作为 XMLObject 类的对应表示,以便用 XML 表示 MFL。现在,将创建转换,用于转换 partnerStocks 变量(包含从 partnerStocks.xml 文件中读取的内容)。我们将使用 XQuery Mapper 创建普通转换,然后实例化表示 MFL 文件的类,以便以 CSV 格式提供数据。
创建一个名为 RawDataTransformation 的新转换。向转换中添加一个方法并将其命名为 transformPartnerStockToRawData,然后将 XQuery 文件命名为 transformPartnerStockToRawData.xq。 对于 Source Type,选择 STOCKS,如下所示。 对于 Target Type,展开 stockquotes.mfl 文件,选择 Stocks 元素并将其添加到 Selected Target Types 中,如下图中所示。 将每个字段映射到其对等项,如下所示。完成后,不要忘记保存转换。 将 RawDataTransformation.java 文件拖放到 Data Palette 中的 Controls 文件夹。现在,将 transformPartnerStockToRawData 方法拖到 read 节点下的流程中。正如您所知,可以将转换作为流程流的一部分调用。 双击 transformPartnerStockToRawData 节点对其进行配置。对于 Send Data 部分,选择 partnerStocks 变量。对于 Receive Data,创建一个名为 stocks 的新变量。单击 Close 完成配置。此时,流程应该类似于下图。 此时,我们便拥有了一个以 XML 形式表示 MFL 的对象。有了这个由 stocks 变量表示的对象之后,我们将能够实例化另一个通过 MFL 文件创建的对象(称为“MFL 对象”)。为了进行此实例化,我们只需调用 newInstance 方法并将其作为参数传递到 stocks 对象。我们接下来将执行此操作!
将 XML 对象转换为 MFL 对象的第一步是创建一个将表示 MFL 对象的变量。为此,单击 Data Palette 中的 箭头并选择 Add a Variable...,如下所示。 将变量命名为 stocksMflObject 并通过 Non-XML 选项卡选择其类型,方法是展开 FCTLAppWeb | schemas | stockquotes.mfl 并选择 Stocks,如下所示。完成后,单击 OK。 向流程中添加 Perform 节点并将其命名为 Instantiate MFLObject。 在 Perform 节点内,您可以执行任何种类的 Java 代码。我们将使用此节点实例化刚创建的变量 stocksMflObject。
右键单击刚添加的 Perform 节点并单击 View code。将重定向到名为 perform 的方法内的代码编辑器。在此方法内,添加以下代码行: stocksMflObject = StocksMflObject.newInstance(stocks); 现在,您已拥有已格式化文件的对象表示。应该将其写出到 FTP 服务器。
要设置本地 FTP,下载 ftpserver-1.0.0-M3.zip 文件并将其解压缩到 /tmp 文件夹。从 Windows 中的命令提示符或 Unix 中的 shell,转到 /tmp/ftpserver-1.0.0-M3/bin 目录。 在 Windows 中运行以下命令: ftpd.bat res/conf/ftpd-typical.xml 或者在 Unix 中运行以下命令(注意,需要 root 权限): ftpd.sh res/conf/ftpd-typical.xml 这将在计算机上使用默认用户名 admin 并以“admin”作为口令启动 FTP 服务器。下图显示了正在运行的 FTP 服务器。 现在,向应用程序中添加新的 文件控件。将其命名为 FtpFileControl 并对其进行配置,如下图中所示。请特别注意 Type of Data,它表示此 文件控件将专门用于原始数据。 在 Data Palette 中,单击 ftpFileControl。它的属性将在 Properties 视图中显示。查找 FileControl.Ftp 属性,如下所示。 配置 FileControl.Ftp 属性,如下所示。唯一可能不明显的属性为 localDirectory,这是控件在通过 FTP 发送文件之前编写文件的位置(发送之后删除文件)。 请特别注意 FileControl.FileInfo 属性。注意, directoryName 属性应该配置为仅是 / 而不是 C:/。 将 write 操作拖放到流程内,作为最后一个节点。 配置 write 节点以发送 stocksMflObject 变量,并在 Receive Data 部分中创建一个名为 properties 的变量以保存操作结果。单击 Close 并保存流程。 您刚配置了文件控件以将数据发送到 FTP。让我们对其进行测试!
右键单击流程并选择 Run As | Run On Server。 如果在流程执行期间一切正常,则在 /tmp/ftpserver-1.0.0-M3/res/home 内应该存在一个 CSV 文件,其中包含先前位于 /tmp/repository/partnerStocks.xml 内的股票报价。 |