电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

通过企业服务总线构建事件驱动的体系结构


发布日期:2021/11/8
 

作者Lucas JellemaOracle ACE 和 Oracle 融合中间件区域总监

通过一个简单的示例了解如何配置 ESB 以发布企业事件

月发表

在面向服务的体系结构 (SOA) 领域一个比较重要的概念是事件驱动的体系结构 (EDA)与事件机制类似例如在 JavaScript 或 GL 环境中可以将触发器(可执行程序代码段)与按压按钮更改域值或者提交查询等事件相挂钩而 EDA 指定服务业务事件的挂钩方式

大多数业务事件(从下订单请求报价到聘用新员工或提供某部分设备)触发企业内多个响应如果进行更近一步的细化过程步骤内的事件(例如调用服务失败超过预定义阈值或者到达指定目标)可能还会引起过程自身之外的相关方的兴趣

EDA 允许您将创建或遇到事件的过程中的所有这些事件发布到一个中央事件处理主干上从而使所有感兴趣的相关方可以从此处找到它们产生事件的过程或服务本身无需考虑这些外部各方否则会给该特定过程的执行带来压力系统之间交织过密造成维护困难

在本文中您将通过一个基于 Oracle ESB 的简单示例了解如何配置该中央主干以消息的形式将发布的事件传递给外部各方(如果您没有时间学习本教程结论部分提供了一个链接其指向一个包含完整 JDeveloper 应用程序的 zip 文件)

背景

Oracle ESB 具有使其适用于其任务的关键功能首先它可利用多种方法检索消息(事件通知)通过 JMSWeb 服务调用文件系统或数据库表等等它还可提取带有与事件相关数据的消息并对其进行转换通常是将其转变为一种更通用更规范的企业模型

ESB 还可以将一个粗粒度事件消息转换为多个细粒度消息例如它可以在新用户已经注册并下了第一个订单时通过从基于 Web 的客户订单系统接收的消息创建一个新客户事件以及新订单事件在将原始消息转换为一个或多个更规范可能更具针对性的消息时ESB 还可以丰富消息的内容(例如通过添加当前日期和时间戳信息或添加从参考数据源查找的信息)多个事件用户可能会有此要求

最后根据事件(消息的内容)的特性ESB 可将内容经过扩充的已转换消息提供给多个输出通道例如 Web 服务JMS数据库过程或表文件或者电子邮件

(注意BPEL 流程就是事件报告程序的一个主要示例执行 BPEL 流程时在几个阶段中和在一些情况下可以发布事件通常是以在 ESB 中调用 Web 服务的形式进行

有几种方法可以帮助对事件感兴趣的相关方使用来自 ESB 的消息

ESB 可以将所有消息提供给 JMS 主题并让感兴趣的相关方自己挑选获取消息以及将其转换为自定义格式的方式

可直接从 ESB同一服务(使用来自发信方的事件并可能将其消息转换为更规范的格式)调用每一个希望知晓消息的系统当然这意味着 ESB 服务需要针对增加的每一个相关方进行扩展并且可能需要包含针对各个附加方的额外转换和过滤规则

ESB 提供了一个接收事件转换和丰富消息和将该事件发布到 JMS 的服务以及一个针对感兴趣各方的专用服务该专用服务将直接从接收服务(耦合)接收事件消息或从 JMS(取消耦合)读取消息为其正在服务的相关方执行附加的定制转换以及通过适用于消息接收方的任何方式(JMSWeb 服务调用数据库操作)提供消息在该示例中添加一个新的对事件(消息)感兴趣的相关方意味着要在 ESB 中创建一个独立的松散耦合的新服务但是这会引入一些特殊开销更多的服务定义以及服务实例并且还会在内部通过外部 JMS 主题或多或少地复制 ESB 所做的内容

在大多数情况下第二种方法可能是最好的注意从 ESB 服务实例调用以通知感兴趣各方的目标服务可以并行调用也可以顺序调用(取适用的方式)

利用 Oracle ESB 开发 ESB 服务

可以在 Oracle ESB(Oracle 融合中间件中 Web 服务基础架构的 ESB 组件)中按如下方式创建该方法的简单演示

该案例中的业务事件是聘用新员工当新员工签订合同后该事件将发布到 ESB该事件消息包含姓名年龄性别职务以及入职日有多方对该事件感兴趣

新员工需要向安全部门注册该部门将建立帐户颁发胸牌以便员工能够进入该机构等等

财务部门需要为新员工准备多种工资单和支出报表

Junior Managers Club 将邀请处于管理位置 岁以下的所有人参加他们的会社为此他们希望在聘用了符合条件的新员工时能够得到通知

使用 Oracle ESB 实现该简单的业务事件服务如下所示

通过人力资源部门(为此目的调用 ESB Web 服务)发布(即发即弃)业务事件 NewEmployeeESB 服务使用该事件并执行三个也执行一些转换的路由规则

调用 SendNewEmployeeFileToJuniorManagerClub 目标服务并将 CSV 文件写入目标目录

调用 InformFinanceDepartmentOfNewEmployee 目标服务并将新员工记录写入财务数据库

调用 NotifySecurityWebService 以传递包含新员工数据的消息这会启动 BPEL 工作流流程该过程在为新员工创建安全胸牌时需要手动活动

部署该服务时为发布新员工事件而对 NewEmployee ESB Web 服务的任何调用都会触发两个或三个(针对 岁以下的新管理层员工)目标服务该体系结构的关键是将事件发布方(人力资源部门)与事件使用方完全分离这样添加新用户不会对该部门有任何影响新员工事件中的更改基本上可以在 Router Service 中得到解决无需影响事件使用方

要开发针对该事件的 ESB 服务您需要完成以下步骤

下载并安装 Oracle SOA 套件 或更高版本

下载并安装 Oracle JDeveloper 或更高版本

启动 SOA 套件

运行 JDeveloper

执行初始设置 初始设置

您首先需要做一些准备然后才能开始实现 EDA具体来说您需要使用 DDL 脚本在数据库中创建一个表将文件复制到您文件系统上可供 JDeveloper 访问的目录并将一个很小的简单 BPEL 项目部署到您的 SOA 套件实例

下面是设置步骤

    将示例代码下载解压缩到一个临时目录

    使用 employees_tablesql 脚本为所需的数据库模式创建表 EMPLOYEES稍后您会用到该表在该表上插入新记录

    将文件 NewEmployeeEvent_Templatecsv 复制到可从 JDeveloper 访问的目录您将在文件适配器向导中使用该文件为应该由将在本教程中开发的 ESB 服务编写的文件建模

    将 SecurityProcessingNewEmployeezip 文件解压缩到一个工作目录该文件中包含一个小的 JDeveloper 项目和一个 BPEL 流程SecurityProcessingNewEmployee这是一个简单的流程该流程调用 BPEL 工作流服务让安全部门接受为新员工创建新胸牌的任务

    将 SecurityProcessingNewEmployee 项目加载到 JDeveloper 将该项目部署到 SOA 套件实例中的 BPEL PM我们需要让该 BPEL 流程在您于 ESB 中开发 EDA 服务时可用

部署 BPEL 流程方法是右键单击 SecurityProcessingNewEmployee 并选择 Deploy 选项然后选择选项 BPEL Process Deployer

通过弹出的窗口您可以选择一个到 BPEL PM 实例的 Connection

选择正确的连接按 OK 启动部署

创建 JDeveloper 应用程序

在 JDeveloper 中创建一个名为 EventDrivenArchitecture 的新应用程序如果 JDeveloper 要为您创建一个默认项目按 Cancel

转至 New Gallery这次选择 ProjectsESB Project 项

将项目命名为 NewEmployeeEventService

当 ESB 图打开后单击左上角的小图标以创建一个系统

在 ESB 服务器中注册项目后就可以在 ESB 控制台中使用您创建的系统或服务组了服务是系统的一部分或者是系统内的组的一部分系统和组都提供了一种组织服务的方法 — 不同于 BPEL 流程中的作用域系统的一个重要方面是可以从路由服务并行调用不同系统中的目标服务同时按顺序调用同一系统中的目标服务


将新系统命名为 NewEmployeeEventSystem

在开始使用 ESB 中的事件处理服务之前需要根据 New Employee 事件指定从人力资源部门接收的确切消息类型为此创建一个 XML 模式文档 (XSD)以描述为该事件接收的 XML 消息的结构

转至 New Gallery选择节点 GeneralXML 并单击可用项列表中的 XML Schema然后为新的 XML 模式文档输入名称 — 在本例中为 NewEmployeeEventMessagexsd

注意该模式有一个相对简单的消息结构其复杂类型比较简单(带有五个简单类型元素)描述了与该业务事件相关的核心信息

现在返回 ESB 选项卡开始创建服务

将 Routing Service 组件从 Component Palette 拖放至 ESB Service为 Routing Service 输入名称使用 Browse 按钮和 Type Chooser 选择 NewEmployeeEventMessage 模式定义中的 NewEmployeeEvent 模式元素

以下是 Type Chooser 的屏幕截图可用于选择描述该 Routing Service 输入的 XSD 元素

在创建即发即弃(无回调异步)的服务时无须指定回复消息或失败

可允许外部进程通过 Web 服务接口直接调用这个 NewEmployeeEventRS 路由服务如果使用其他通道发布该事件 — 例如通过在数据库表中输入新员工或利用 JMS 将新的 Employee 文件置于 FTP 服务器上 — 您可以将入站适配器服务添加到 ESB 服务该服务会转发获得的 NewEmployeeEventRS 消息此时假设人力资源部门将使用 Web 服务接口

现在来看一下出站适配器请记住该事件涉及三方安全部门财务部门以及 Junior Managers Club

安全部门具有一个要调用的 Web 服务终端 — 实际上该终端只是将在部门内运行的 BPEL 流程的前端其中包括负责创建物理证件的人工流程

财务部门希望您直接在数据库表中插入一条新记录以后可从此处读取该记录

Junior Managers Club 明确表示希望通过写入文件系统特定位置的 CSV 文件接收新 Junior Manager 的消息它提供了一个示例文件用于说明该文件的格式

为此我们需要向 ESB 服务添加出站服务

在 ESB 制图器中将 File Adapter 拖放至图中这会弹出一个窗口您可以通过该窗口定义 File Adapter 服务的细节以便将 CSV 文件写入文件系统

输入服务名称然后单击 WSDL File 域旁边的 Define Adapter Service 图标

接下来将进入 File Adapter Configuration Wizard在第一个页面上指定服务名称(基本上是确认之前在 Create File Adapter Service 弹出窗口中指定的内容

单击 Next 后将转到 Operation 页面在这里您可以指定希望服务编写文件

Step 将询问是否为服务将要编写的文件指定输出目录和命名惯例目前指定硬编码目录要简单些 — 但是这显然不是创建可移植服务的最佳方法可使用几个动态元素指定文件名(但一次只能指定一个)例如消息或序列的日期或时间

在 Step 指定文件的输出格式信息的结构如何?因为要编写 CSV 文件所以单击 Define Schema for native format 按钮

这将显示 Native Format Builder您可在其中创建 XSD以便 File Adapter 用于从其中的 XML 数据创建 CSV 文件使用示例 CSV 文件Junior Manager Club 发送指令时游刃有余


接受默认值并单击 Next

在下一个页面中浏览到示例文件或键入其名称和位置然后按 Next

接受第 页上的默认值并单击 Next

分别为包含多条记录的元素和表示一条记录的元素输入名称例如使用 NewJuniorManagers 和 NewJuniorManager这些将在创建该文件服务的映射时出现在编写的文件中不会显示

接受第 页上的默认值并单击 Next

在第 页上选中复选框Use the first record as the field names同样这将使 XSD 的可读性更强 — 它不会影响由该服务编写的文件

在下一个页面上汇总了由向导创建以供 File Adapter 使用的 XSD 文件的信息您可以检查这些信息然后单击 Next 接受

这将显示 Native Format Builder 向导的最后一页单击 Finish

返回 File Adapter Configuration Wizard单击 Next


然后单击 Finish您将返回 Create File Adapter Service 弹出窗口再次单击 Finish

NewEmployeeEventService 的 ESB 图已经通过 SendNewEmployeeFileToJuniorManagersClub 服务得到了扩展

双击 NewEmployeesRS 图标指定路由规则以将 NewEmployeeEvent 消息传递至该目标服务

单击绿色加号创建一个新的路由规则Browse Target Service 对话框将打开您可以在其中选择路由规则将向其传递消息的服务

在 SendNewEmployeeFileToJuniorManagersClub 上选择 write 操作单击 OK

添加分为两部分的过滤器表达式 — 一部分表明新雇员的年龄应低于 另一部分要求角色应为管理类以下是必须输入的完整表达式

/inp:newEmployeeEvent/inp:age < and contains(MANAGERPRESIDENTVICE PRESIDENTTECHNOLOGY MANAGERCFOCHIEFSUPERVISOR/inp:newEmployeeEvent/inp:role)

现在需要指定如何转换从人力资源部门接收的消息以将其传递至目标服务

单击映射图标选择对话框中的 Create New Mapper File 选项

单击 OK进入 Mapper 工具您需要在其中连接两个 XSD 文档因此定义 XSLT 以将源 XSD 转换为目标


首先将 newEmployeeEvent 元素拖放至 NewJuniorManager 的顶部以创建一个简单明显的映射

取消选中复选框 Match Elements Considering their Ancestor Names

现在您已经拥有了一个最初的映射

role 元素尚未映射到 Position 域而 FirstDay 域对于日期格式的要求比较特殊

将 role 拖放至 position然后将连接顶部的 Component Palette 中的 formatdateTime Date Function 从 firstDayAtWorkDate 拖放至 firstDay

现在双击功能项以确切指定如何执行转换

接下来该解决财务部门的特定消息传递需求了

财务部门财务部门希望您直接将新记录插入数据库表该表位于公司数据库之一的 FINANCE 部门中

SQL> desc employees Name Null? Type NAME NOT NULL VARCHAR() GENDER VARCHAR() JOB_TITLE VARCHAR() START_DATE DATE

您需要为该目标创建一个新的适配器服务使用 Database Adapter 为 NewEmployeeEventRS 设置一个目标服务在 Component Palette 的 Adapter Services 部分中将 Database Adapter 拖至 ESB 文档以下窗口将弹出


输入 Adapter Service 的名称单击 WSDL File 域后面的第一个图标以配置数据库适配器

创建一个 New Database Connection以连接到公司数据库的 FINANCE 模式(注初始设置期间创建 EMPLOYEES 表的方式创建数据库模式连接

指定连接名称

然后输入 FINANCE 模式的用户名和口令

单击 Next 按钮输入 Connection 的详细信息

在这一步中您需要指定 JDBC URL 细节例如主机名端口以及数据库 SID完成后单击 Next 测试连接

如果成功则单击 Finish否则更正错误的信息

这将返回 Database Adapter Configuration Wizard单击 Next

选择希望该服务执行的操作只需插入新记录


单击 Next您将转到 Select Table 页面单击 Import Tables 选择 FINANCE 数据库中的 EMPLOYEES 表

单击 Import Tables按 Query 按钮这将显示一个包含 FINANCE 模式下所有表的列表选择 EMPLOYEES 表并单击 OK

当 Select Table 向导页面再次出现时单击 Finish

您将返回 Create Database Adapter Service单击 OK

现在将返回 ESB 图

将该目标服务连接到 NewEmployeeEventRS双击路由服务的图标

单击绿色加号以添加路由规则

选择 InformFinanceDepartmentOfNewEmployeeEvent 服务下的 Event 操作并单击 OK


单击 Mapping 图标定义从传入的 NewEmployeeEvent 到目标服务的映射

选择 Create New Mapper File 并单击 OK

将 newEmployeeEvent 事件元素拖至 top:Employees 元素

取消选中 Match Elements considering their ancestors 复选框

自动映射将执行转换的第一步

您需要手动将 role 映射到 jobTitle并将 firstDayAtWorkDate 映射到 startDate只需将 Source 元素拖放至 Target 元素即可

最终的映射将如下所示

单击 Save All 图标就快完成了三方中已有两方与 NewEmployeeEvent 链接在一起

安全部门安全部门已经发布了一个 Web 服务您需要通过新员工事件进行调用在该 Web 服务之后潜伏着一个能够启动人工流程的 BPEL 流程(此时这是它唯一可做的事情)

在 ESB 服务中您需要创建另一个 Adapter Service 以便调用这个 BPEL 流程然后将其与 Router Service 相连

从 ESB 服务的 Component Palette 中将 SOAP Service 元素拖放至 ESB 图

Create Soap Invocation Service 对话框将弹出输入该服务的名称例如 NotifySecurityWebService然后单击 Service Explorer 图标

选择 SecurityProcessingNewEmployee 服务(该服务已经部署在 BPEL PM 实例上)


单击 OK

再次单击 OK

双击 Router Service您需要添加一个新的路由规则以将 Soap Invocation Service 连接到 Router Service

单击绿色加号以添加新的路由规则

在 NotifySecurityWebService 目标服务下选择 initiate 操作

单击 OK

上一篇:GNU General Public License序文中译

下一篇:量身订作一个 OS