使用 Oracle SOA 数据库适配器向 Oracle BPM 12c 流程公开数据库
作者:Oracle ACE Dan Atwood
2017 年 7 月
本文分为四个部分,介绍如何使用 Oracle SOA 数据库适配器和调解器向 Oracle BPM 12c 流程公开数据库。
第一部分 — 创建 WebLogic JNDI 数据库连接
本部分介绍如何创建与数据库模式的 WebLogic JNDI 连接。第二部分将介绍此连接创建后如何供数据库适配器使用。
SOA 应用中公开的组件可以作为服务公开,对数据库的调用也不例外。为了从 BPM 流程调用数据库,首先必须将其作为服务公开。
首先,需要创建一个数据源。然后,将数据库模式的数据源配置成包含访问它所需的 JNDI 连接信息。如果只需访问 ADF 中的数据,这就够了。
但是当项目的组合需要以服务形式访问数据库时(例如,当组合的调解器需要连接到数据库适配器时),就需要使用数据库适配器了。在本文的第三部分,会将数据库适配器 SOA 组件拖入项目的 SOA 组合图中的 External References 列中。为了在运行时获得成功,必须先将数据源的数据源 JNDI 连接添加到数据库适配器的 DBAdapter 部署中。这将在本文的第二部分完成。
该示例使用 Oracle XE 11g 和 12c SE 数据库中预先安装的 HR 模式,但同样的步骤也可以用于公开其他数据库模式。
- 打开 WebLogic 控制台(例如 http://localhost:7001/console)并登录。
- 在此步骤中,数据源被配置成 SOA 基础架构的数据源。此数据源提供与实际底层数据提供程序的连接。在 WebLogic 中,通过选择 Services →Data Sources 来配置 JDBC 数据源。

图 1:数据源
- 单击 New →Generic Data source。
- JNDI 代表 Java 命名和目录接口。这是基于 Java 的应用客户端访问底层命名和目录服务(如 DNS、LDAP、JMS 和数据库模式)的标准接口。这样,客户端就能够以标准方式访问不同服务,而不管目标的底层技术如何。
记下此步骤中输入的 JNDI 名称。该名称应类似于“jdbc/myDBSourceName”。这是一个多步骤向导,在最后一步,单击列表中的相应复选框,指向正确的服务器。
- 将 JDBC 数据源配置成指向 Oracle 11g 和 12c 数据库自带的 HR 模式。记住 JDBC 数据源的 JNDI 名称:jdbc/hr。稍后在本文第二部分将使用这个值配置连接池。在本例中,数据源名称设置为 HR(下面图 2 中编号 1),JNDI 名称设置为 jdbc/hr(下图编号 2)。单击 Next(下图编号 3)继续。

图 2:JDBC 数据源
- 对于 Oracle XE 或 SE,将驱动程序设置为“Oracle's Driver (Thin XA) for instance connections...”。单击 Next。
- 对于 Oracle XE 或 SE 开发测试环境,保留“Supports Global Transactions”复选框为未选中状态(如果选中,将发生运行时错误)。单击 Next。
- 对于安装在 Oracle XE 数据库上的 HR 模式,输入 XE 作为 Database Name,否则,输入 ORCL,然后对于测试开发环境,输入 localhost 作为 Host Name,将 Database User Name 设置为 HR,然后将 Password 和 Confirm Password 域设置为 HR 模式的密码,然后单击 Next。
- 单击 Test Configuration 按钮,验证测试是否成功。

图 3:测试数据库模式连接
单击 Next。 - 如果开发测试环境中安装了单独的 SOA 托管服务器,请选中 soa_server 旁边的复选框,然后单击 Finish。

图 4:选择 SOA 作为目标
完成此操作后,新的数据源应该出现列表中,设置如上。

图 5:HR 出现在数据源列表中
如果不打算使用 SOA 数据库适配器连接数据库,则无需配置它。因为本文第三部分和第四部分使用此适配器访问客户信息,所以第二部分介绍如何将此处创建的 JNDIconnection 信息添加到数据库适配器的配置中。
第二部分 — 配置数据库适配器
配置出站连接池
在本文的第一部分,配置了与数据库模式的 JNDI 连接。因为要使用数据库适配器访问来自数据库的信息,所以需要了解该模式是否存在。在此,要将 JNDI 连接信息添加到部署的数据库适配器。
- 要将数据库适配器配置成使用本文第一部分中创建的 JNDI 名称 jdbc/hr,请单击 Deployments,然后单击 DBAdapter。

图 6:数据库适配器部署
- 接下来,将配置连接池。WebLogic 通过连接池与数据库通信。这个池让 WebLogic 可以使用固定数目的数据库连接,而不是产生不断创建和删除连接的开销。每个数据源都分配了一个连接池,用于连接实际的数据提供程序(在本例中为数据库模式)。回想一下,创建数据源时提供了一个 JNDI 名称。配置连接池时将使用这个 JNDI 名称。单击 Configuration 选项卡(下图编号 1),单击 Outbound Connection Pools 选项卡 (2),展开 javax.resource....(3),然后单击 New (4)。

图 7:出站连接池
- 单击连接工厂旁边的单选按钮,然后单击 Next。
- 在 JNDI Name 域中输入本文第三部分在 JDeveloper 中创建数据库连接时要使用的 JNDI 名称:eis/DB/HR(区分大小写)。然后单击 Finish。
单击 OK。您将看到以下内容:

图 8:出站连接完成
配置数据库适配器到数据库的 JNDI 连接
- 仍然选中数据库适配器的“Outbound Connection Pools”选项卡,再次展开 javax.resource.cci.ConnectionFactory,然后单击刚刚新建的 eis/DB/HR 连接。
- 单击“xADataSourceName”字段,然后输入与最初在第一部分中创建和配置底层数据库模式的数据源时输入的文本(在本示例中为 jdbc/hr)。

图 9:xADataSourceName 字段数据库名称 请注意,保存此文本有一个窍门。输入文本之后,一定要按 Enter 键。否则,输入的文本将不会保存在 xADataSourceName 字段中。
- 单击 Save 按钮。仔细检查,确保 xADataSourceName 字段存储了正确的值,并注意顶部提醒更新数据库适配器部署的消息。这是让刚才所做更改生效所必需的。要更新部署,请单击 Deployments(下图中 1),然后单击 DbAdapter 旁边的复选框 (2),再单击 Update 按钮 (3)。

图 10:更新部署
单击 Next(假设部署配置文件无需更改),然后单击 Finish。
现在应该可以使用 JNDI 连接,数据库适配器已准备好访问 HR 数据库模式。在本文第三部分中,该适配器将被添加到 SOA 组合中,并通过一个调解器公开。
第三部分 — 创建一个 SOA 组合项目通过调解器调用数据库适配器
这部分介绍如何使用数据库适配器(它使用本文第一部分定义的数据库 JNDI)创建 SOA 组合项目。在下一部分也是本文的最后一部分,将由 BPM 组合项目流程调用此处公开的服务。
- 打开 JDeveloper,单击 File → New → Projects →(如下所示),然后选择右侧的 SOA Project。

图 11:创建 SOA 项目
单击 OK。 - 将服务命名为 HRService,然后单击 Next。将手动添加调解器,因此单击 Empty Composite(通常只需在此处单击 Composite with Mediator),然后单击 Finish。
向组合项目添加数据库适配器
- Composite Editor 现在应该是打开的(如果没有打开或者需要重新打开,请在 Applications 选项卡中双击 SOA 文件夹中代表此项目的 composite.xml 文件的 HRService)。在右侧的 Component Palette 中,选择 Database 并将其拖到 Composite Editor 中的 External References 列,如下所示。

图 12:添加数据库适配器
这将自动启动 Database Adapter Configuration Wizard。单击 Next,将新数据库适配器命名为 HR_Employee,然后单击 Next。 - 在 Service Connection 对话框中,单击 → Add 按钮定义一个新连接。
- 在 Create Database Connection 对话框中,在 Connection Name 域中输入 HR → 在 Username 域中输入 HR→ 在 Password 域中输入模式密码 → 在 Host Name 域中输入 localhost → 确保在 JDBC Port 域中输入 1521 → 在 SID 域中输入 XE(对于 Oracle XE)或 ORCL(对于 Oracle SE)。

图 13:配置数据库模式连接
- 仔细检查这些域中的输入内容是否与以上所示完全相同,然后单击 Test Connection 按钮验证输入项是否正确。单击 OK。这是在本文第二部分管理控制台中为此数据库模式的数据库适配器配置的名称。

图 14:输入 JNDI 连接字符串
单击 Next。
为 HR_Employee 适配器选择一个表
- 在下面所示的 Operation Type 对话框中选择将并入服务的不同类型的操作。在本示例中,数据库适配器将对 HR 数据库模式执行 SELECT,因此从此对话框中选择 Perform an Operation on a Table 选项 → 只保留 Select 选项处于选中状态。
单击 Next。
- 接下来的一系列步骤是选择要读取的 Employee 表。单击左下角的 Import Tables 按钮 → 单击 Query 按钮 → 从左侧列表中选择 EMPLOYEES 表并单击 > 按钮将其添加到右侧的 Selected 列表。

图 15:选定 EMPLOYEES 表
单击 OK。等待几秒钟,将显示 Select Table 对话框且列表中出现 EMPLOYEES。单击 Next 按钮。
使用 SQL 从适配器创建 EMPLOYEES 表
- 因为 EMPLOYEES 表与 HR 模式中的其他表关联,Relationships 对话框中显示了其他表的外键。这里无需操作,因此单击 Next 按钮。
- 在 Attribute Filtering 对话框中,选择将包含在 SQL SELECT 语句中的列。如下所示,要限制返回的列,请取消选中 jobId 和 commisionPct 旁边的复选框。

图 16:选择要返回的列
单击 Next。
- 在 Define Selection Criteria 对话框中添加参数来优化 SELECT 语句有点混乱。单击 Parameters 部分旁边的 Add 按钮。

图 17:添加参数
输入参数 employeeId。此参数将在 select 语句中用于标识从 EMPLOYEES 表返回的一行。单击 OK → 单击 SQL 部分旁边的 Edit 按钮。这将打开 SQL Expression Builder。单击 Add 按钮 → 将 Second Argument 的单选按钮更改为 Parameter,这将自动选择刚才添加的 employeeId 参数。

图 18:根据参数进行选择
单击 OK。SQL Expression Builder 向导到此完成。
- 继续操作之前,验证 SQL 是否已构建,如下所示。

图 19:参数查询完成
- 单击 Next。在 Advanced Options 对话框中,因为唯一主键 EMPLOYEE_ID 作为选择条件,将 Max Rows 域更改为 1。单击 Next → Next → 单击 Finish 完成新的 HR_Employee 数据库适配器服务的配置。注意,新的 HR_Employee 数据库适配器出现在 External References 列中。
在 Composite Editor 中添加调解器组件
- 将 Mediator 组件从 Component Palette 的 Service Components 部分拖到 Composite Editor中的 Components 泳道。

图 20:向组合添加调解器
将调解器命名为 HRServiceMediator,保留下拉菜单设置为选中 Define Interface Later→ 单击 OK 在组合中创建调解器。
添加 SOAP Web 服务绑定
下面几步将组合应用作为 SOAP Web 服务公开。
- 将 SOAP 从 Component Palette 拖到 Exposed Services 泳道。

图 21:将组合作为 SOAP 服务公开
- 在 Create Web Service 向导对话框中,在 Name 域中输入 GetEmployeeById → 选择 Generate WSDL from Schema 按钮(该按钮位于 WSDL URL 域右侧)。

图 22:生成 WSDL
- 在 Interface Type 下拉菜单中选择 Synchronous Interface。在 Input 部分,单击 + 图标。
- 将 Message Part Name 更改为 employeeId → 单击 OK。这样,就可以用包含员工 id 的字符串作为输入。
- 从这里下载将在下一步中用作输出的 XSD。
- 在 Output 部分,单击 + 图标 → 将 Part Name 更改为 employee → 单击 Browse 图标 →单击 Import Schema File 图标(位于右上角)→单击 Location 下拉菜单 → 选择刚下载的 HREmp_forSoa.xsd 文件 → 单击 OK → OK → 选择 → EmployeeInfo 元素。

图 23:选择输出类型
单击 OK → OK。验证输入和输出映射与以下所示相符。 
图 24:SOAP 服务的输入和输出
单击 OK → 单击 copy wsdl and its dependent artifacts into the project 复选框。单击 OK。
在 Composite Editor 中连线
Composite 图现在有三个断开的组件,分布在三列中,现在要连接起来。
- 首先选择 Web 服务右侧的 >> 图标,并将其拖到调解器左侧,然后松开鼠标。

图 25:连接服务与调解器
- 现在将调解器连接到数据库适配器:首先选择调解器 → 选择调解器右侧的三角形图标,并将其拖到数据库适配器的 >> 图标。
定义调解器转换
调解器可以执行的路由由刚刚对 Web 服务与数据库适配器组件进行的连线决定。在本例中,就是与数据库适配器的一对一连线,因此调解器的路由相对简单。在此组合中,调解器负责对 Web 服务输入请求与 SOA 组件之间传递的数据进行编组和转换。
- 双击 HRServicesMediator。因为这是一个同步操作,所以必须完成输入和输出转换。这将在下面几步中完成。
- 首先是输入转换,因为它是一个简单的映射,单击 Assign Values 按钮。

图 26:Assign Values 按钮
完全展开 (+) in 和 out,然后映射两个 employeeId 元素。 
图 27:映射 employeeId 元素
单击 OK。 - 现在映射从供给 Web 服务输出的数据库回流的数据。单击 Synchronous Reply 的 Transform Using 转换图标。

图 28:转换映射
单击 + 创建新的 XSLT 转换映射器文件。单击 OK → OK → OK。展开源的 Employees 集合元素。
- 将源的 Employees 映射到目标的 EmployeeInfo,自动将命名非常类似的元素彼此映射。单击 + 展开右侧的 if 元素,请注意,除了 phoneNumber,所有其他元素都是自动映射的。

图 29:展开 if 元素
- 在将 phoneNumber 映射到 ContactPhone 之前,先将 JDeveloper 的 XLST 映射首选项更改为在映射可选元素时自动添加 if。在 JDeveloper 的菜单中,单击 Tools → Preferences → + 展开 XSL Maps → 选择 XSL Editor → 选中 Map source node, insert xsl:if checking source node existence 复选框。单击 OK。
- 回到 XSLT 映射器中,将 phoneNumber 映射到 ContactPhone。请注意,添加这个映射之后,会添加一个 if,在将源 phoneNumber 元素映射到目标 ContactPhone 元素之前检查是否存在可选元素。

图 30:在 XSLT 中自动添加 if
单击 Save。
将 HRService 部署到 SOA 应用服务器
- 将此项目部署到 SOA 服务器,以便测试组合应用。在 Application Navigator 中,鼠标右键单击 HRService → Deploy → HRService → Next → Next → 选择 BPM Application Server → Next → Next → Finish。
使用 Enterprise Manager 测试 GetEmployeeById Web 服务
- 在浏览器中打开 Enterprise Manager(例如,http://localhost:7001/em)。使用 weblogic 凭证登录。
- 展开 SOA 文件夹 → default → 选择新的 HRService。

图 31:选择用于测试数据库适配器组合的组合
- 单击 Test 按钮。在 employeeId 域中输入 100,如下所示(Employees 表上有一行的 id 为 100)。

图 32:输入有效的员工 id
- 向上滚动,单击右上角的 Test Web Service 按钮,并注意从数据库返回的响应。

图 33:成功调用服务
前面已经创建了调用数据库适配器的 SOA 组合,本文第四部分将介绍如何从 Oracle BPM 流程调用新服务。
第四部分 — 从 BPM 组合项目中的流程调用公开的服务
在这部分中,根据 id 域中输入的内容,将数据库表中存储的候选人的薪金及其他相关信息提供给 BPM 流程。
- 从这里下载将用于调用服务的 BPM 项目。(这是一个 12.2.1.2 项目)
- 打开项目,并打开 Candidate Approval 流程。
- 要打开 BPM 项目的组合图,单击位于流程模型图右上角的图标。

图 34:Candidate Approval 流程 — 打开组合图
- 将 SOAP Web 服务组件拖到组合图的 External References 列中。
- 将服务命名为 HRService(下图编号 1)。
- 单击 Find existing WSDLs 图标 (2)。
- 选择 Application Server (3)。
- 单击下拉菜单,选择应用服务器(本例中为 BPM_Compact)(4)。
- 展开组合(如下所示),直至显示先前部署的 HRService 服务。
- 展开标记为 HRService [Default...] 的组合,选择 GetEmployeeById 服务 (5)。

图 35:定义 HRService 外部引用
单击 OK。
- 选中 copy wsdl and its dependent artifacts into the project 复选框。
单击 OK →OK→Save。
- 重新打开 Candidate Approval 流程。如下所示,在 Message Start Event 与 Script 活动之间插入一块空白,在顺序流中的这块空白处添加一个 Service 活动。

图 36:向流程添加服务活动
- 将新的服务活动命名为 Retrieve Candidate Information。单击 Implementation 选项卡 →将 Type 下拉菜单更改为 Service Call → 单击 Browse 图标 → 单击 HRService → OK(如果未显示 HRService,则停止并重新启动 JDeveloper)→单击 Data Associations 链接。

图 37:选择服务并打开 Data Associations 对话框
- 选中 Input 选项卡后,将左侧的 employeeIdInput 元素拖向右侧的 employeeId。单击顶部的 Output 选项卡→ + 展开 employeeInfo,设置出站信息。在右侧,单击 + 展开 employee →+ 展开 employeeSummary。

图 38:展开输出
- 要设置从数据库表检索的数据值,请将 XSL Transformation 图标拖到 employee 元素上。

图 39:向 employee 输出添加 XSLT 映射
从左侧列表中选择 employeeInfo,然后单击 > 图标将其移到右侧。

图 40:为到 employee 的 XSL 转换选择 employeeInfo
单击 OK → OK → OK→ Save All。
- 将左侧的 EmployeeInfo 拖动到右侧的 EmployeeSummary(不是 EmployeeInfo)。出现自动映射对话框时,单击 OK。XSL 转换现在应如下所示。

图 41:输出的 XSL 转换
- 保存项目。
部署 EmployeeOnboarding 项目。
- 与本文第三部分中一样,打开 Enterprise Manager,测试部署的组合。这次不是测试 HRService 组合,而是选择刚部署的 EmployeeOnboarding 项目。展开 parameters→ 在 employeeId 域中输入 101→ 单击 Test Web Service 按钮。选择 Response 选项卡后,单击 Launch Flow Trace。

图 42:Response 选项卡
- 选择 CandidateApproval 流程。

图 43:在流跟踪中选择流程
- 选择下拉菜单,单击 Tree View。

图 44:Audit Trail 树视图
- 展开 After Service Call 活动 → 单击右侧链接之一。

图 45:展开 Script 活动
请注意,服务成功调用,数据返回流程。

图 46:成功!
关于作者
Oracle ACE Dan Atwood 是 Avio Consulting 的一位高级业务流程管理 (BPM) 架构师和培训总监,负责为客户提供从概念到实现和交付的 Oracle BPM 和 Oracle PCS 一揽子解决方案。Dan 是经过认证的 Oracle Unified Business Process Management Suite 11g、Business Process Management Suite 12c 和 Oracle Application Development Framework 11g 实施专家。
本文谨代表作者的专业见解、结论和意见。Oracle 发布本文旨在鼓励社区内就此类信息进行广泛交流,并促进同行的评估和评论。相关 Oracle 产品团队尚未审查本文是否符合 Oracle 的标准和实践,其发布不应被解释为 Oracle 对其中所表述内容的认可。