科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道探索WebLogic Integration 8.1 RDBMS Event Generator

探索WebLogic Integration 8.1 RDBMS Event Generator

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

事件生成器广泛用于业务流程决策由企业系统中生成的事件所驱动的集成应用程序之中。配置事件生成器时,WebLogic Integration利用数据源和已在WebLogic Server中定义的连接池,通过使用指定的模式获得数据库连接。

来源:dev2dev 2007年10月15日

关键字: 应用 技术 Weblogic 中间件

  • 评论
  • 分享微博
  • 分享邮件

  摘要

  事件生成器广泛用于业务流程决策由企业系统中生成的事件所驱动的集成应用程序之中。BEA WebLogic Integration提供本地事件生成器,诸如File Event Generator、JMS Event Generator、Timer Event Generator、HTTP Generator和RDBMS Event Generator。此类事件生成器帮助企业应用程序对事件进行异步追踪,并且在事件发生时采取适当的操作。本文主要讨论如何有效地使用WebLogic Integration 8.1所提供的RDBMS Event Generator。

  简介

  将业务驱动数据持久存储在数据库管理系统内是非常普遍的现象。WebLogic Integration的RDBMS Event Generator可通过Message Broker Channel引发重要事件,因而能够协助企业应用程序追踪数据库更改。若需对事件做出反应,企业应用程序可方便地订阅相应的通道。

  在WebLogic Server实例内,Java进程可以利用消息代理相互通信。消息代理提供了发布者与订阅者之间有保障的消息交付。消息代理被细分到Message Broker Channel中,其属性与Java Messaging Services极为相似,不同之处在于,Message Broker Channel经过了优化,从而可在WebLogic Integration进程内得到更有效的使用。

  RDBMS Event Generator可通过WebLogic Integration Administration Console创建。由WebLogic Integration创建的触发器和数据库中的表构成了RDBMS Event Generator实现的基础。它利用触发器跟踪数据库更改,并使用表存储将发布到一个Message Broker Channel的结果。WebLogic Integration Administration Console提供了创建RDBMS Event Generator的能力,只需在表的层次上将触发器类型指定为Insert、Update或Delete即可。开发人员不能定制触发器作为业务需求的一部分。本文将重点介绍RDBMS Event Generator ,并分步骤论述如何创建带有一个定制触发器的RDBMS Event Generator。

  通过阅读本文,您将了解如何使用WebLogic Integration 8.1生成RDBMS Event Generator和对发生的事件做出反应的代码。

  RDBMS Event Generator背后的“化学反应”

  在创建RDBMS Event Generator时,立刻能想到的问题有:

  在使用WebLogic Integration Administration Console创建RDBMS Event Generator的过程中,WebLogic Integration是如何与数据库交互的?

  WebLogic Integration如何生成事件?

  配置事件生成器时,WebLogic Integration利用数据源和已在WebLogic Server中定义的连接池,通过使用指定的模式获得数据库连接。在取得和数据库的必要连接后,WebLogic Integration进行如下操作:

  根据指定的触发器类型,在Administration Console中已配置好的表上创建数据库触发器。

  在辅助WebLogic Integration识别来自数据库的事件,并通过Message Broker Channel将该事件传达至订阅者的模式下,生成阴影表。

  在事件被触发时创建数据库序列以生成序列号。这有助于WebLogic Integration 识别仅位于阴影表中的记录。

  一旦在阴影表中发现一条记录(以固定的时间间隔轮询的过程中,时间间隔在Administration Console中指定),WebLogic Integration 即(依据阴影表中存储的值)向Message Broker Channel发布XML消息,供订阅者使用。在向Message Broker Channel发布XML消息后,阴影表中的WebLogic Integration记录将被清除。

  如您所见,这里出现了两个独立的进程:当某种事件触发条件得到满足时,用于更新数据库追踪记录的数据库触发器;WebLogic Integration 为追踪数据库记录和最终生成Message Broker Channel 消息而进行的定期轮询。

  WebLogic Integration采用的触发器和表的结构

  下面让我们再进一步了解一下由WebLogic Integration创建的触发器和表。

  数据库序列

  WebLogic按照EventGeneratorName_BEA_SEQ的命名约定在数据库中创建序列:

  表和触发器

  由WebLogic Integration创建,用于在数据库内存储待发布记录的表遵循EventGeneratorName_BEA_SDW命名法 。试想一个表包含如下三个字段: Fieldname1、Fieldname2 和Fieldname3。如果为了发布Fieldname1和Fieldname2而创建一个RDBMS Event Generator,WebLogic Integration将创建一个具有如下结构的表:

  

  Fieldname1

  OLD_Fieldname1

  Fieldname2

  OLD_Fieldname2

  BEA_SEQ_ID

  BEA_POLLED_AT

  

  触发器结构

  由WebLogic Integration 生成,用于跟踪数据库事件的触发器按照EventGeneratorName_BEA_TRG 命名。试举一例:

  

  CREATE OR REPLACE EVENTGENERATORNAME_BEA_TRG

  AFTER TRIGGER_TYPE ON SCHEMANAME.TABLENAME FOR

  EACH ROW

  DECLARE

  TEMP INTEGER;

  BEGIN

  SELECT SCHEMANAME.EVENTGENERATORNAME_BEA_SEQ.NEXTVAL

  INTO TEMP FROM DUAL;

  INSERT INTO SCHEMANAME.EVENTGENERATORNAME_BEA_SDW

  (FIELDNAME1, OLD_FIELDNAME1, FIELDNAME2, OLD_FIELDNAME2,

  BEA_SEQ_ID) VALUES

  (:NEW.FIELDNAME1,:OLD.FIELDNAME1,:NEW.FILEDNAME2,

  :OLD.FIELDNAME2, TEMP);

  END;

  

  如您所见,这填充了存储事件值的记录。

  定制RDBMS Event Generator

  默认的事件生成器简单且直观。它利用数据库触发器,根据数据库中作出的更改为一个通道触发事件。但是WebLogic Integration Administration Console不支持任何定制。用户可指定表来监视事件/触发器类型和要发布的列。然而,Administration Console未提供如下功能:

  为触发事件而指定业务规则。

  监视表中的特定列。

  虽然使用Administration Console 无法实现这些目的,但是如上所述,RDBMS Event Generator 实现基于数据库触发器来触发事件。可通过适当修改数据库内的触发器,或编写自己的过程来在阴影表中插入记录,从而使之适应自己的业务需求。虽然BEA尚未提供相关支持,但我们照此实行了一段时间,并已取得一些成果。

  示例应用程序

  作为使用RDBMS Event Generator 的一个示例,我们将开发一个小型的Inventory Management Application(库存管理应用程序)。存货的目的在于及时对订单进行跟进。这个系统要求在存货数量到达补货点时,能智能化地进行补货。但是,有关当前存货数量是否达到补货点的细节只能通过持久化存储的数据(例如:数据库或文件系统)来追踪。

  当存货数量达到补货点时,该场景就要求事件生成器通知Fresh Stock Ordering Application新存货。

  以下是Inventory表的结构:

  

  NAME NULL? TYPE

  --------------------- -------- --------------

  PRODUCT_ID NOT NULL VARCHAR2(10)

  QTY_ON_HAND NUMBER

  QTY_ON_ORDER NUMBER

  COST NUMBER(14,2)

  

  现在我们来看一下如何创建和使用事件生成器。

  创建RDBMS Event Generator

  以下是创建Inventory Management Application例子中的RDBMS Event Generator所需的步骤:

  启动WebLogic Integration Domain Server。

  登录Administration Console。

  单击Event Generator,选择RDBMS-〉Create New。

  指定惟一的Event Generator Name。

  在RDBMS Event Generator Definition页面,单击Define New Channel Rule。

  在RDBMS Event Generator Channel Rule Definition 页面, 指定:

  发布事件的通道

  通道的说明(Description)

  Event Name (WebLogic Integration利用此名称在数据库内创建触发器、表和序列)

  轮询间隔(Polling Interval)

  用于连接到数据库的数据源;所采用的模式需具有创建触发器、表和序列的特权

  每次轮询的最大行数(Max Rows per Poll)

  每次事件的最大行数(Max Rows per Event)

  Publish As (指定接收的User);如果此项未指定,消息将按照匿名发送那样发布到通道。

  Event Type (帮助WebLogic Integration选择适当的触发器(Insert/Update/Delete))

  Table Name;通过选择Table Name和Select Table Columns链接来指定要发布的表和列名称。

  注意:若用户打算用手动方式指定表名称,请在指定模式和表名称时使用大写字母。

  单击Submit。

  图1给出了本例的部分设定。

  

  

  

  图1。为RDBMS Event Generator 定义通道规则(点击看大图)

  再来看看INVENTORY_BEA_SDW 表。回忆此阴影表中的记录,这些记录将由WebLogic Integration使用,来识别所触发的事件。

  

  NAME NULL? TYPE

  ---------------------- -------- -------------

  PRODUCT_ID VARCHAR2(10)

  OLD_PRODUCT_ID VARCHAR2(10)

  QTY_ON_HAND NUMBER

  OLD_QTY_ON_HAND NUMBER

  QTY_ON_ORDER NUMBER

  OLD_QTY_ON_ORDER NUMBER

  COST NUMBER(14,2)

  OLD_COST NUMBER(14,2)

  BEA_SEQ_ID NOT NULL NUMBER(28)

  BEA_POLLED_AT NOT NULL NUMBER(19)

  

  以下是WebLogic Integration在受监视的表中创建的触发器:

  

  CREATE OR REPLACE TRIGGER INVENTORY_BEA_TRG

  AFTER UPDATE ON SYSTEM.INVENTORY FOR EACH ROW

  DECLARE TEMP INTEGER;

  BEGIN

  SELECT SYSTEM.INVENTORY_BEA_SEQ.NEXTVAL INTO

  TEMP FROM DUAL;

  INSERT INTO SYSTEM.INVENTORY_BEA_SDW

  (PRODUCT_ID, OLD_PRODUCT_ID, QTY_ON_HAND,

  OLD_QTY_ON_HAND, QTY_ON_ORDER, OLD_QTY_ON_ORDER,

  COST, OLD_COST, BEA_SEQ_ID)

  VALUES (:NEW.PRODUCT_ID,:OLD.PRODUCT_ID,:NEW.QTY_ON_HAND,

  :OLD.QTY_ON_HAND,:NEW.QTY_ON_ORDER,:OLD.QTY_ON_ORDER,

  :NEW.COST,:OLD.COST,TEMP);

  END;

  

  该触发器证实,库存表的记录一旦发生更新,事件即被触发。但是,多数时候,业务要求远不止于此。在本例中,我们假设事件仅在当前存货量低于预先定义的临界值时被触发。如何加以定制,使之满足业务需求呢?

  只要对RDBMS 稍有了解,就能知道,修改触发器其实很容易。例如,业务规则可以成为触发器的一部分,并应用于数据库里。以下是我们所用的修改后的触发器:

  

  CREATE OR REPLACE TRIGGER INVENTORY_BEA_TRG

  AFTER UPDATE OF QTY_ON_HAND ON SYSTEM.INVENTORY

  FOR EACH ROW

  DECLARE TEMP INTEGER;

  BEGIN

  SELECT SYSTEM.INVENTORY_BEA_SEQ.NEXTVAL INTO

  TEMP FROM DUAL;

  IF :NEW.QTY_ON_HAND <10 THEN

  INSERT INTO SYSTEM.INVENTORY_BEA_SDW

  (PRODUCT_ID, OLD_PRODUCT_ID, QTY_ON_HAND,

  OLD_QTY_ON_HAND, QTY_ON_ORDER, OLD_QTY_ON_ORDER,

  COST, OLD_COST,BEA_SEQ_ID)

  VALUES (:NEW.PRODUCT_ID,:OLD.PRODUCT_ID,:

  NEW.QTY_ON_HAND,:OLD.QTY_ON_HAND,:NEW.QTY_ON_ORDER,

  :OLD.QTY_ON_ORDER,:NEW.COST,:OLD.COST,TEMP);

  END IF;

  END;

  

  为Message Broker Channel创建使用者

  至此我们已成功创建了事件生成器,接着将为Message Broker Channel 创建使用者。以下是所需步骤。

  打开WebLogic Workshop ,单击File ->New -> Application 。如图2所示,选择Process Application,然后将此应用程序命名为InventoryOrder。

  

  

  图2 为Message Broker Channel 创建使用者的第一步

  在应用程序中选择Schema 文件夹。如图3所示,右击文件夹,选择New -> Channel File,然后将文件命名为InventoryEvent.channel。

  

  

  图3 为Message Broker Channel 创建使用者的第二步

  打开InventoryEvent.channel 文件,并创建一个新的XML Channel用于通过事件生成器接收XML消息,如图4所示(点击看大图)。

  

  

  

  图4 为Message Broker Channel 创建使用者的第三步

  单击Starting Event节点,选择订阅Message Broker Channel且通过一个事件开始的选项。

  双击Subscription节点,在下拉菜单中选择通道来订阅。

  

  

  图6 为Message Broker Channel 创建使用者的第五步

  选择Receive data,然后选择Variable Assignment。如图7所示,利用“Select variables to assign dropdown”创建一个新的XmlObject类型的变量,然后将XML经通道分配给新创建的变量。

  

  

  图7 为Message Broker Channel 创建使用者的第六步

  从Process Node选项板中拖出一个Perform节点,将其置于Subscription和Final节点之间。将该Perform节点命名为PrintInputXml,如图8所示。

  

  

  图8 为Message Broker Channel 创建使用者的第七步

  单击该Perform节点以打开如下弹出窗口,选择View Code,如图9所示。

  

  

  图9 为Message Broker Channel 创建使用者的第八步

  将以下这段代码添加到Process Definition File (JPD)的Perform节点的代码段中:

  

  public void perform() throws Exception {

  System.out.println("Incoming Xml is" +

  this.inputEventXml.xmlText());

  }

  

  根据数据库内发生的事件(在本例中即当前存货量低于10件),该应用程序会将WebLogic Integration发布到Message Broker Channel的XML消息打印出来。

  部署并运行应用程序

  选择Build -> Build Application 。

  一旦应用程序成功构建,选择Process Definition File (JPD)。

  选择Debug -> Start。

  JDI代理在程序启动后随即附接。此时,RDBMS Event Generator 将对数据库里的事件做出反应,并通过向应用程序订阅的Message Broker Channel 发布消息,通知其所发生的事件。

  为生成此事件,可这样更新数据库信息,即把当前存货量变更为少于10件。例如,如果数据库中当前存货量为11件,则运行如下查询,为Ordering Fresh Stock生成此事件:

  

  UPDATE INVENTORY SET

  QTY_ON_HAND = QTY_ON_HAND - 2

  WHERE PRODUCT_ID=2;

  

  一旦上述查询在数据库中运行,即调用通过上述步骤所创建的触发器,在阴影表中插入一条记录。一旦将变更提交给数据库,即触发RDBMS事件,并从阴影表获取记录,从而以XML格式发布数据。

  发布给Message Broker的XML消息形式如下:

  

  INCOMING XML IS

  "HTTP://WWW.BEA.COM/WLI/RDBMS_EG/INVENTORY

  TABLEROWSET.XSD"XMLNS:XSI="HTTP://WWW.W3.ORG/2001/

  XMLSCHEMA-INSTANCE" XMLNS:WLD=

  "HTTP://WWW.BEA.COM/2002/10/WEBLOGICDATA"

  XMLNS="HTTP://WWW.BEA.COM/WLI/RDBMS_EG/INVENTORY">

  

  11

  9

  10

  10

  10100100

  

  

  结束语

  通过异步检索来自数据库的信息,WebLogic Integration 的RDBMS Event Generator 为企业应用程序与数据库的集成提供了一种简单的方法。本文探讨了通过定制RDBMS Event Generator 以满足企业的业务需求的可能性。此外,本文重点阐述了WebLogic Integration的RDBMS Event Generator实现及如何有效利用其提供的各项特性。

  

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章