主题
面向服务的架构
在 Oracle SOA Suite 中动态设置 Web 服务和 JCA 适配器端点作者:Simone Geib 面向 WLI 用户 的 SOA Suite 概要系列文章的这一部分介绍如何在 Oracle SOA Suite 中动态设置适配器端点,其过程与 WebLogic Integration 控件中的过程非常类似。 2010 年 3 月发布
简介大部分业务流程都会用到与外部系统的集成。这些系统可以是文件系统、Web 服务、消息队列、数据库或后端应用程序。大部分情况下,这些系统的端点(队列名称、URL、文件目录等)在开发、测试和生产各环节中是不同的。其他情况下,这些端点在应用程序的生命周期中可更改。 在这些情况下,开发人员可以修改业务流程内有问题的端点属性,然后重新编译、重新部署、重新测试等。显然,这一过程费时且容易出错。更好的办法是让可能会更改的端点变成动态的。 理想情况下,管理员在管理控制台中设置端点属性值。然后业务流程在运行时读取和设置这些值。 本文介绍如何在 Oracle WebLogic Integration (WLI) 和 Oracle SOA Suite 中处理动态端点。 WLI 中的动态端点WLI 中的大部分控件允许指定 动态属性,运行时将动态属性作为一个 XML 变量传递。这些动态属性覆盖了设计时为控件定义的属性。 为了设置动态属性,必须创建一个符合控件的动态属性模式的 XML 变量,并在控件的 setProperties() 方法中使用它。可以使用 getProperties() 方法检索当前的属性设置。 我们以电子邮件控件为例。该控件的 setProperties() 方法接受一个 EmailControlPropertiesDocument 参数。 EmailControlPropertiesDocument 类型是一个 XML Beans 类,它由 DynamicProperties.xsd(位于 WLI 应用程序的 Schemas 项目的系统文件夹中)中定义的相应模式元素生成。 下面是用于设置电子邮件控件动态属性的 XML 变量的示例:
<EmailControlProperties>
<smtp-address>myorg.mymailserver.com:25</smtp-address>
<from-name>Joe User</from-name>
<from-address>joe.user@myorg.com</from-address>
<reply-to-address>reply@myorg.com</reply-to-address>
<reply-to-name>Joe User</reply-to-name>
</EmailControlProperties>
经常通过 XML MetaData Cache 控件检索控件的属性。(参见 Oracle Database Adapter)。 该控件在运行时从 WLI 缓存检索一个 XML 文档,该文档是管理员通过 WLI 管理控制台创建的。可随时更改此 xml 文档的内容,不会影响已部署的应用程序。 SOA Suite 中的动态端点可以为 Web 服务绑定组件或 JCA 适配器绑定组件配置消息头属性,这些组件是已部署的 SOA 组合应用程序的组成部分。Oracle JCA 适配器将特定于底层后端操作的属性作为头元素公开,并且允许在业务流程内部操作这些元素。 (参见 Using Header Properties for Oracle JCA Adapters) 还可以从 Oracle Enterprise Manager Fusion Middleware Control Console (EM) 添加、删除或恢复 Oracle JCA 适配器属性。下面列出的属性是根据添加、删除或更新属性时适配器的行为进行分类的。 InteractionSpec 或 ActivationSpec 属性这组属性要求适配器端点是循环的。这组属性的值可在 EM 控制台中更改。然而,属性依赖性约束验证要求使用 Oracle JDeveloper 对这些属性的组合进行更改(添加或删除)。 (参见 The InteractionSpec or ActivationSpec Properties) 端点属性无需重启端点,适配器即可获知端点属性的更改。可以添加或删除属于该组的属性。端点属性表示适配器可能希望公开的辅助调优属性。辅助调优属性包括各种时间间隔、阈值和其他值。这些端点属性不通过 interactionspec 或 activationspec 属性公开。 (参见 Endpoint Properties)配置适配器的端点属性包括 invoke、 receive、 reply 和 onMessage 选取活动分支在内的许多 BPEL 活动都提供一个 Properties 选项卡。可以通过这个选项卡设置 JCA 适配器的头属性。 为了使用该功能,要将属性值赋值给一个字符串变量。然后可以在属性选项卡中使用该变量,具体情况将在下面的用例示例中说明。 (有关 BPEL 活动中各属性选项卡的说明,请参见 Introduction to BPEL Activities。) SOA Suite 中的 域值映射在概念上类似于 WLI 中的 XML 元数据缓存。运行时可以使用域值映射来检索信息。域值映射的使用将在本系列的后续文章中介绍。 通过 Enterprise Manager 为 Web 服务绑定组件或 JCA 适配器配置消息头属性,Oracle JCA 适配器和 Web 服务可以 SOA Suite 组合应用程序中的服务或引用绑定组件。绑定组件是将 SOA 平台与外界相连接的网络协议和服务。可以为 Web 服务绑定组件或 JCA 适配器绑定组件配置消息头属性。 (参见 Understanding Binding Components)有关端点属性的更多信息,请参见 Oracle Fusion Middleware Administrator's Guide for Oracle SOA Suite 的 Configuring Service and Reference Binding Components 一章。 下列适配器支持头属性:
有关 Oracle JCA 适配器属性的更多信息,参见 Oracle JCA Adapter Properties。 要配置 JCA 适配器或 Web 服务属性,在 Enterprise Manager 中选择该适配器或 Web 服务的 Properties 选项卡。 (参见 Configuring Service and Reference Binding Component Properties)。 下一节将详细介绍这一过程。 通过 Oracle Enterprise Manager 配置适配器的端点属性可以从 Enterprise Manager Console 执行各种 Oracle SOA Suite 管理(配置、监视和管理)任务。其中一个任务就是配置 JCA 适配器的端点属性。 通常,设计时在 Oracle JDeveloper 中定义适配器的属性。但是,有可能在以后的阶段中需要编辑或添加预定义属性,或者创建或删除属性。 编辑适配器的预定义属性要编辑某个入站适配器的预定义属性,使用下列方法之一转到 SOA 组合应用程序: 从 SOA Infrastructure 菜单:
编辑预定义属性
为适配器添加预定义属性为适配器添加预定义属性:
为适配器创建新属性为入站适配器创建一个新属性:
删除适配器的属性删除入站适配器的某个属性:
恢复适配器的属性值您只能恢复曾经修改过的那些属性。另请注意,您只能对已有的属性值执行恢复操作,不能对在预定义属性列表中添加的属性值或您创建的属性值执行恢复操作。 恢复入站适配器的某个属性值:
更多信息,请参见 Configuring the End Point Properties for an Inbound Adapter 和 Configuring the End Point Properties for an Outbound Adapter。 用例示例:写入文件前更改文件名和目录本示例将演示如何动态更改文件控件(在 WLI 中)和文件适配器(在 SOA Suite 中)的端点(文件名和目录)。为了简单并紧扣要点,我们将创建一个只向文件写入消息的流程。现实情况会比这种情况复杂得多。 在 WLI 中实现用例我们不准备详细讲解这个 WLI 用例,因为我们假定读者了解如何在 WLI 中实现动态文件控件。我们将重点介绍该用例在 SOA Suite 中的实现。 文件控件用于向本地目录写入文件。与许多其他控件一样,文件控件也提供了动态设置端点的动态属性:
<?xml version= '1.0' encoding= 'UTF-8' ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
targetNamespace="http://demo/demoCustomer1"
xmlns:cu="http://demo/demoCustomer1">
<xs:element name="customer">
<xs:complexType>
<xs:sequence>
<xs:element ref="cu:key"/>
<xs:element ref="cu:firstname"/>
<xs:element ref="cu:lastname"/>
<xs:element ref="cu:address"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="key" type="xs:string"/>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
</xs:schema>
在我们的示例中,WLI 流程是由一个希望将客户的 XML 文档作为输入的客户端请求节点启动的。XML MetaData Cache 控件用于读取文件目录和文件名的值。转换控件用于为文件控件创建属性。最后,通过文件控件的 setProperties() 方法设置属性。然后,使用文件控件的 write 方法将客户消息写入文件。 尽管该流程中的某些步骤可以合并,但为了使本示例简单易懂,还是将这些步骤作为单独的步骤。 图 1 说明了该 JPD。 图 1:JPD 在 SOA Suite 中实现用例本节仍将介绍上个示例,但是在 SOA Suite 中实现的。 在本用例中,通过一个客户 xml 消息调用一个 Web 服务来启动业务流程。该业务流程使用文件适配器将客户信息写入到一个文件中。 下节将介绍如何部署和测试该流程,然后演示如何在流程中使用适配器头属性或者通过 Enterprise Manager 控制台更改适配器端点属性。 创建 SOA 应用程序和项目开始:
创建 BPEL 流程
添加文件适配器
将 BPEL 流程与文件适配器相连接接下来,我们将 BPEL 流程与文件适配器相连接并完成接口定义。 连接的各个组件类似于下图: 在组合中对组件进行连接,将自动在 BPEL 流程内创建伙伴链接引用。 设计 BPEL 流程
现在,您的 BPEL 流程应该类似于下图: 我们已经创建了与 WriteCustomerData 服务交互时将使用的变量,但尚未填充这些变量。我们首先填充输入变量。 在 BPEL 中,使用 Assign 活动将数据分配给变量。在此示例中,您希望将客户信息赋值给 WriteCustomerData 服务。
现在,您的 Assign 对话框应该类似于下图:
所有警告都应消失。该流程应该类似于下图: WriteCustomerData 的输入变量现已填充。
部署 SOA 组合必须先使用 Oracle JDeveloper 部署组合应用程序,然后才能测试 BPEL 流程。 开始部署前,请确保您的 SOA 服务器正在运行。 请查看 Deploying SOA Composite Applications,了解如何使用 Oracle JDeveloper 和脚本编写工具部署 SOA 组合应用程序,以及如何创建可在开发、测试和生产环境之间来回移动 SOA 组合应用程序的配置计划。 请查看 Deploying SOA Composite Application,了解如何在 Oracle Enterprise Manager Fusion Middleware Control Console (EM) 中部署、重新部署以及取消部署 SOA 组合应用程序。 在 JDeveloper 内部署组合时,日志应与下面的示例类似: [07:32:39 PM] ---- Deployment started. ---- [07:32:39 PM] Target platform is (Weblogic 10.3). [07:32:39 PM] Running dependency analysis... [07:32:39 PM] Building... [07:33:06 PM] Deploying profile... [07:33:06 PM] Updating revision id for the SOA Project 'DynamicEndpoints.jpr' to '1.0'.. [07:33:06 PM] Wrote Archive Module to D:\1WLI\2SOASuiteMigration\testProjects\JDev\11gPS1\ SOASuiteWLIEssentials\DynamicEndpoints\deploy\sca_DynamicEndpoints_rev1.0.jar [07:33:06 PM] Deploying sca_DynamicEndpoints_rev1.0.jar to AdminServer [SGEIB01.emea.bea. com:7001] [07:33:06 PM] Processing sar=/D:/1WLI/2SOASuiteMigration/testProjects/JDev/11gPS1/SOASuiteWLIE ssentials/DynamicEndpoints/deploy/sca_DynamicEndpoints_rev1.0.jar [07:33:06 PM] Adding sar file - D:\1WLI\2SOASuiteMigration\testProjects\JDev\11gPS1\SOASuite WLIEssentials\DynamicEndpoints\deploy\sca_DynamicEndpoints_rev1.0.jar [07:33:06 PM] Preparing to send HTTP request for deployment [07:33:07 PM] Creating HTTP connection to host:SGEIB01.emea.bea.com, port:7001 [07:33:08 PM] Sending internal deployment descriptor [07:33:08 PM] Sending archive - sca_DynamicEndpoints_rev1.0.jar [07:33:28 PM] Received HTTP response from the server, response code=200 [07:33:28 PM] Successfully deployed archive sca_DynamicEndpoints_rev1.0.jar to AdminServer [SGEIB01.emea.bea.com:7001] [07:33:28 PM] Elapsed time for deployment: 48 seconds [07:33:28 PM] ---- Deployment finished. ---- 测试 BPEL 流程部署成功后,可以通过 Oracle Enterprise Manager Fusion Middleware Control Console (EM) 启动组合服务。
如果一切都按计划进行,则将在 C:\temp 中创建一个新文件 customer_1.xml。 通过 Invoke 活动的 Properties 选项卡在运行时更改文件适配器端点本示例将说明如何在运行时更改适配器端点。与 WLI 用例非常类似,通过 XML Meta Data Cache 控件检索信息,并将信息设置为该控件的属性。 如上所述,可以使用域值映射来检索适配器属性的值。为使本文简明易懂,这个 BPEL 流程示例将对这些属性使用硬编码值,有关域值对的使用将单独介绍。 为属性创建变量
为这些变量赋值这就是在实际情况中需要使用 域值映射 的场合。不过,本示例中我们仍将使用硬编码值。
重复这些步骤,将新的输出文件名设置为该变量文件名。 现在,您的 Assign 活动应该类似于下图:
为该文件适配器设置属性
现在,BPEL 流程应该类似于下图: 重新部署该组合并再次测试 BPEL 流程。现在,在您新选择的目录中应该有一个具有新名称的文件。 在 Enterprise Manager 中更改文件适配器端点不必在 BPEL 流程中动态设置属性,也可以在 Enterprise Manager 中更改 JCA 适配器和 Web 服务的属性。
重新部署该组合并再次测试 BPEL 流程。现在,在您新选择的目录中应该有一个具有新名称的文件。 要点和建议Oracle SOA Suite 提供了两种不同的方法来动态配置 JCA 适配器和 Web 服务端点:第一种是在 BPEL 流程中设置头属性,这与 WLI 中的做法类似;第二种是在 Enterprise Manager 控制台中修改头属性。
|