专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »编程综合 » contentmanager:通过定制的事件处理程序集成外部应用程序和 IBM Content Manager »正文

contentmanager:通过定制的事件处理程序集成外部应用程序和 IBM Content Manager

来源: 发布时间:星期一, 2009年9月7日 浏览:0次 评论:0
  介绍

  IBM Content Manager, Version 8.4.1 支持个用于外部应用集成事件框架当前支持两种集成类型:

  过程集成专门用于和 FileNet Business Process Manager 集成

  通用集成用于集成通用外部应用

  IBM Content Manager, Version 8.4.1(后面简称为 CM8)提供个用于过程集成事件处理对于和 FileNet® Business Process Manager 的外其他外部应用集成可以使用通用集成方式并开发个定制事件处理从而在业务解决方案中支持特定应用逻辑本文讨论如何设计定制事件处理实现和外部应用通用集成

  下面几节概述事件框架和定制事件处理各个方面举例帮助您编写定制事件处理实现个电子邮件应用和 IBM Content Manager 集成

  事件框架体系结构

  图 1 介绍说明支持 IBM Content Manager 和外部应用集成事件框架体系结构用于 FileNet Business Process Manager 事件处理已经解决了过程集成本文主要讨论和通用外部应用集成

  事件框架提供以下 3个功能:

  事件预订它允许指定要监视条目类型和相关联事件

  事件监视它在事件发生时记录事件并生成事件消息这些消息被发送到 Java Message Service (JMS) 消息队列

  事件处理它从 JMS 队列接收事件消息并根据业务逻辑处理这些消息

  图 1. 事件框架体系结构



  在事件预订期间事件预订数据存储在 CM8 库服务器数据库中配置表中使用 CM8 系统管理客户机配置配置数据管理员指定要监视条目类型及其属性

  事件监视部分主要处理事件消息生成CM8 应用通过 CM8 Java 和 C API 接口和库服务器交互在数据库中生成事件数据在发生事件时库服务器根据配置数据记录事件记录事件放在库服务器数据库中事件队列表中事件包含事件类型、事件 ID、条目信息和属性数据事件监视根据配置数据从事件队列表中获取事件数据把这些事件转换为 Java Message Service (JMS) 消息然后把这些 JMS 消息放到 JMS 事件队列中

  事件处理部分主要处理事件消息使用事件处理从 JMS 事件队列中读取包含事件数据 JMS 消息提供集成应用逻辑和 CM8 文档属性能力IBM Content Manager, Version 8.4.1 为 FileNet Business Process Manager 提供了实现过程集成事件处理但是对于其他应用集成需要开发定制事件处理

  个场景

  在业务环境中电子邮件是种简单有效协作方式这个场景是介绍说明如何在业务上下文中把电子邮件通知功能集成到这个事件框架中

  虚构 XYZ 保险公司要求当保险代理提交汽车理赔表单时马上通过电子邮件自动地通知理赔员在提交理赔时保险代理提供理赔信息比如理赔编号、理赔金额和策略 ID另外他指定个通知列表其中包含应该审查这次理赔理赔员

  另外在理赔员接收电子邮件通知的后他可以通过电子邮件中 URL 链接查看理赔信息包括理赔表单文档接下来他可以根据他判断更新理赔状态理赔员只需打开电子邮件并通过 URL 进行理赔审查这是电子邮件集成个常见需求

  下面场景以文档创建操作为例演示电子邮件应用和 IBM Content Manager 集成(后面几节使用这个场景介绍各个步骤)

  保险代理在 IBM Content Manager 中创建个条目类型为 “ClaimForm” 理赔文档

  管理员配置了条目类型 “ClaimForm”指定要监视代表文档创建操作 “Add Item” 事件所以库服务器会在事件队列表中插入行事件数据包括 “ClaimNo”、“ClaimAmount” 和 “Notication” 等属性值

  事件监视在事件队列表中搜索提交接收文档 A “Add Item” 事件事件监视还从配置表接收配置数据它把配置信息和从事件队列表中接收事件数据转换为个自我描述事件消息消息采用通用事件格式(即 CBE 格式)然后把事件消息发送到个 Java Message Service 队列(即 JMS 队列)

  定制事件处理监听 JMS 队列从队列接收文档创建事件接下来它解析 CBE 格式事件数据然后使用这些信息向通知列表中理赔员发送电子邮件

  理赔员接收电子邮件通知并审查理赔文档然后他可以使用 CM8 应用更新理赔状态

  IBM Content Manager 中定义了用于汽车理赔处理 ClaimForm 条目类型如 图 2 所示它由以下属性组成:

  ClaimNo - 理赔编号作为理赔标识符

  ClaimAmount - 理赔金额

  claimStatus - 理赔状态

  PolicyID - 和理赔相关联策略 ID

  Notication - 通知列表包含审查人电子邮件地址

  图 2. ClaimForm 条目类型



  它还有个文档部分其中包含理赔表单(见图 3)

  图 3. 文档部分定义



  通用集成事件预订

  本节讨论通用集成事件预订所需步骤可以在两个级别上启用事件预订:库服务器级和条目类型级后者粒度更细必须在 Library Server Configuration 对话框中选择 “Enable Event Subscription”(见图 4)为库服务器例子启用事件日志记录

  图 4. 库服务器配置



  对于条目类型级图 5 给出条目类型 “ClaimForm” 事件预订举例(条目类型 “ClaimForm” 见 图 3)对于这个条目类型预订事件是 “Add Item” 事件“Event Subscription” 页面提供对条目级事件预订支持

  图 5. 事件预订



  在 “Event Subscription” 页面中单击 Add 按钮时显示 “Define Event Subscription” 对话框(见 图 6)选择 General egration 按钮这个场景要集成通用外部应用选择 “ClaimForm” 条目类型所有文档属性在对 “Add Item” 事件事件监视中监视它们

  图 6. 添加事件

 

  定制事件处理设计

  从本质上说定制事件处理个 JMS 应用它支持这个场景中描述业务逻辑它使用异步消息交付机制实现个消息监听器接收 JMS 队列中刚到达消息定制事件处理基本功能是使用 JMS 队列中事件消息相应地和外部应用进行交互对于这个场景事件处理必须连接到 IBM Content Manager 以获取事件消息中引用条目文档属性另外事件处理使用 JavaMail API 组合出个电子邮件通知然后把电子邮件发送给理赔员进行审查

  清单 1 中代码举例给出这个场景定制事件处理实现结构首先导入以下功能所需包:

  访问 JMS 队列 - JMS 和 Java Naming and Directory Interface (JNDI) 包

  发送电子邮件 - JavaMail 包

  解析事件消息 - SAX API 包

  获取内容数据 - Content Manager API 包

  myEventHandler 类实现两个 JMS 监听器:javax.jms.MessageListener 接口 _disibledevent=>  } 
 
  public void onMessage(javax.jms.Message message) 
  { 
    // listen to the JMS queue 
    // retrieve a JMS message 
    // parse the JMS message to obtain the event data 
    // process the event data 
    // compose an e-mail 
    // call the sendMail function to send out an e-mail notication 
  } 
 
  public void onException(JMSException exc) 
  { 
    // pr the error message when a JMS exception occurs 
  } 
 
  public void sendMail(String mailhost, String from, String to, 
            String subject, String text) 
  { 
    // send an e-mail notication to the claim reviewers 
  } 
} 

  下面几节介绍这个举例主要部分(可从 下载 部分获得这个):

  连接 JMS 队列

  获取事件消息中事件数据

  解析事件消息中事件数据

  从 CM8 服务器获取事件引用内容数据

  根据内容数据组合出电子邮件

  把电子邮件发送给理赔员

  连接 JMS 队列

  清单 2 演示设置 JMS 队列访问步骤首先用队列连接工厂名查找上下文对象从而获得个队列连接工厂从这个队列连接工厂创建个队列连接接下来从队列连接创建个队列会话用队列名查找上下文对象从而获得队列然后为指定队列创建个队列接收器作为消息消费者队列接收器用消息选择符 APPLICATION = 'none' 监听队列它只从 JMS 队列获取包含消息属性 APPLICATION 且属性值为 'none' 消息APPLICATION = 'none' 表示消息来自通用集成

  在创建队列接收器的后在队列接收器中设置消息监听器在队列连接中设置异常监听器在启动 JMS 连接的前还执行两个任务:

  化用于解析事件消息 SAX 解析器

  连接 Content Manager 以获取内容数据

  最后步启动 JMS 连接启动 JMS 连接的后onMessage 消息监听器和 _disibledevent=>    // create a queue connection 
    connection = factory.createQueueConnection; 
    .out.prln("Queue connection created"); 
    // create a queue session 
    qSession = connection.createQueueSession(false, 
                         javax.jms.Session.AUTO_ACKNOWLEDGE); 
    .out.prln("Queue session created"); 
    // create a queue 
    testQueue = (javax.jms.Queue)ctx.lookup(_queue_name); 
    .out.prln("Queue = [" + _queue_name + "]"); 
    // create a consumer listening to the specied queue 
    // for message property APPLICATION = 'none' (general egration) 
    qReceiver = (QueueReceiver)qSession.createConsumer(testQueue, 
                              "APPLICATION = 'none'"); 
    //  the message listener 
    qReceiver.MessageListener(this); 
    //  the exception listener 
    connection.ExceptionListener(this); 
 
    // initialize the SAX parser 
    try { 
      _parser = initParser(_dh); 
    } catch (SAXException se) { 
      .out.prln("SAXException - " + se.getMessage); 
      throw se; 
    } 
 
    // connect to the Content Manager 
    dsICM =  DKDatastoreICM; 
    dsICM.connect(database, userid, pw, ""); 
    .out.prln("datastore connected."); 
 
    // start the JMS connection 
    connection.start; 
    .out.prln("Queue connection started"); 

  获取事件数据

  在启动 JMS 连接的后onMessage 消息监听器以先进先出方式获取 JMS 队列中消息先把 JMS 消息转换为 TextMessage 对象如 清单 3 所示从 TextMessage 对象中获取消息另外获取消息 6个消息属性:

  DATABASE - 数据库名表示生成此事件 CM8 服务器名称

  TYPE - 事件类型(例如 TYPE = "item-create")

  LAUNCH - 启动标志表示消息是否请求启动个工作流值可以是 LAUNCH = "true" 或 LAUNCH = "false"对于通用集成LAUNCH 值是 "false"

  ID - 消息 ID 是事件标识符比如 "AA1234567890123456789012345678901234567890123000"

  APPLICATION - 应用类型表示和工作流启动相关联应用对于和 FileNet Business Process Manager (BPM) 过程集成值是 APPLICATION = "BPM"对于通用集成值是 APPLICATION = "none"

  COUNT - 数据元素数量表示事件中包含多少个数据元素如果事件长度小于或等于 1024那么事件中只有个上下文数据元素否则数据元素数量大于 1定制事件处理需要把多个上下文数据元素合并在

  接下来解析采用通用事件格式(例如 CBE 格式)消息从 CBE 格式消息串中获取以下信息:

  全局例子 ID - strGlobalInstanceId 变量表示事件全局例子 ID比如 "AA1234567890123456789012345678901234567890123000"这也是消息 ID

  事件数据 - strReturnMsg 变量包含来自 CM8 内容存储库事件数据

  事件创建时间 - strReturnTime 变量包含创建事件时间时间采用 GMT 格式比如 "2008-03-19T01:03:11.256Z"

  应用名称 - strApplication 变量表示生成事件应用名称即 "Content Manager Event Monitor"

  组件名称 - strComponent 变量表示生成事件组件比如 "Content Manager 8.4.01.000"

  执行环境 - strExecutionEnvironment 变量表示执行环境(操作系统和体系结构)比如 "Windows XP[x86]"

  主机位置 - strLocation 变量表示事件监视主机名和 IP 地址比如 "myhost/1.11.22.33"

  子组件名称 - strSubComponent 变量表示子组件名称即 "Event Monitor"

  清单 3. 获取事件数据

   
      // cast the message to the TextMessage object 
      msg = (TextMessage) message; 
      // retrieve the raw  from a JMS message 
      rawString = msg.getText; 
 
      .out.prln("Reading message: " + rawString); 
 
      // retrieve the message properties from a JMS message 
      msgDatabase = msg.getStringProperty("DATABASE"); 
      msgType = msg.getStringProperty("TYPE"); 
      msgLaunch = msg.getStringProperty("LAUNCH"); 
      msgID = msg.getStringProperty("ID"); 
      msgApplication = msg.getStringProperty("APPLICATION"); 
      msgCount = msg.getStringProperty("COUNT"); 
 
      // create an input source from the raw  
      ByteArrayInputStream bais =  ByteArrayInputStream 
                    (rawString.getBytes("UTF-8")); 
      InputSource is =  InputSource(bais); 
      bais.close; 
 
      // parse the  
      try { 
       _parser.parse(is); 
      } catch (SAXParseException se) { 
       .out.prln("Encountered a SAX parser error" 
                 + " - " + se.getMessage); 
       se.prStackTrace; 
       throw se; 
      } 
 
      // retrieve the information from a CBE-formatted  
      strGlobalInstanceId = ((myContentHandler)_dh).getGlobalInstanceId; 
      strReturnMsg = ((myContentHandler)_dh).getReturnMsg; 
      strReturnTime = ((myContentHandler)_dh).getReturnTime; 
      strApplication = ((myContentHandler)_dh).getApplication; 
      strComponent = ((myContentHandler)_dh).getComponent; 
      strExecutionEnvironment = ((myContentHandler)_dh).getExecutionEnvironment; 
      strLocation = ((myContentHandler)_dh).getLocation; 
      strSubComponent = ((myContentHandler)_dh).getSubComponent; 


  解析事件数据

  清单 4 是简单解析代码实现它解析从消息中获取事件数据这段代码是从事件数据中获得 PID 串和 ITEMTYPE 名称后面要使用 PID 串和 ITEMTYPE 名称获取内容数据并组合电子邮件通知

  用事件数据和分隔符 ";" 例子化个 StringTokenizer 对象while 循环遍历符号直到找到 "ICMEMEND" 或遍历完所有符号每个符号表示为个由 <tag>、= 和 <value> 组成 3 元组元素包含 ITEMTYPE 标记符号包含事件数据中引用文档条目类型名称包含 PID 标记符号包含事件数据中引用文档永久 ID

  清单 4. 解析事件数据

   
      // Use the StringTokenizer to parse the event message 
      StringTokenizer tokenizer =  StringTokenizer(strReturnMsg, ";"); 
 
      // variable for PID 
      String pid = ""; 
      // variable for itemtype 
      String itemtype = ""; 
 
      String strPart = ""; 
       pos = 0; 
      String tagPart = ""; 
 
      // retrieve pid and itemtype from the event message 
      while (true) { 
       strPart = tokenizer.nextToken; 
        (strPart.equalsIgnoreCase("ICMEMEND") 
         || strPart  null || strPart.equals("")) ; 
 
       pos = strPart.indexOf('='); 
       tagPart = ""; 
 
        (pos > 0) { 
         tagPart = strPart.sub(0, pos); 
       } 
        continue; 
 
        (tagPart.equalsIgnoreCase("ITEMTYPE")) { 
         pos = strPart.indexOf('='); 
 
          (pos > 0) { 
           itemtype = strPart.sub(pos + 1); 
         } 
       } 
        { 
         (tagPart.equalsIgnoreCase("PID")) { 
          pos = strPart.indexOf('='); 
 
           (pos > 0) { 
            pid = strPart.sub(pos + 1); 
          } 
        } 
       } 
      } // end while 


0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: