通过ESB构建事件驱动体系结构(一)

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

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

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

  在本文中,您将通过一个基于 Oracle ESB 的简单示例了解如何配置该中央主干,以消息的形式将发布的事件传递给外部各方。 

  背景

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

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

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

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

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

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

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

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

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

  利用 Oracle ESB 开发 ESB 服务

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

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

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

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

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

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

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

  •   调用 SendNewEmployeeFileToJuniorManagerClub 目标服务并将 CSV 文件写入目标目录
  •   调用 InformFinanceDepartmentOfNewEmployee 目标服务并将新员工记录写入财务数据库
  •   调用 NotifySecurityWebService 以传递包含新员工数据的消息。这会启动 BPEL 工作流流程,该过程在为新员工创建安全胸牌时需要手动活动。

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

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

  •   下载并安装 Oracle SOA 套件 10.1.3.1 或更高版本。
  •   下载并安装 Oracle JDeveloper 10.1.3.1 或更高版本。
  •   启动 SOA 套件。
  •   运行 JDeveloper。
  •   执行初始设置。
  •   初始设置

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

  下面是设置步骤:

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

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

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

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

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

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



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

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

  创建 JDeveloper 应用程序

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

  转至 New Gallery,这次选择 Projects、ESB Project 项:

  将项目命名为 NewEmployeeEventService。

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

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

  将新系统命名为 NewEmployeeEventSystem。


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

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

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

  现在,返回 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 服务接口。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值