使用 solidDB、WebSphere Message Broker 和 DB2 pureXML 实现应用程序日志

如何设置应用程序日志的基础设施

由于 XML 在许多应用程序环境中的灵活性和适用性,它已经成为首选的日志格式。在本文中,您将学习如何通过结合 IBM® WebSphere® 和 IBM DB2® 的 XML 特性轻松设置应用程序日志环境。我们首先介绍一个简单的应用程序日志场景,然后展示如何使用 solidDB 缓存和分离日志基础设施中的应用程序。可以使用 WebSphere Message Queue 和 WebSphere Message Broker 可靠地将应用程序中的日志消息移动到 DB2,在 DB2 中可以使用 pureXML® 功能存储和查询这些日志消息。为了标准化各种消息格式,在将日志文件存储到 DB2 之前,还将使用 WebSphere Message Broker 将日志文件转换为其他 XML 格式。

Daniel G. Schall, IBM 实习生, IBM  

Daniel SchallDaniel Schall 在德国 University of Kaiserslautern 攻读应用计算科学学位。到 2009 年 3 月为止,他一直在 IBM 做实习生,与 Henrik Loeser 一起处理应用程序日志方面的事务。目前他正忙于毕业论文。



Henrik Loeser, Dr., DB2 on Linux、UNIX 和 Windows 方面的 pureXML Storage 架构师, IBM  

Henrik LoeserHenrik Loeser 是 DB2 on Linux、UNIX、和 Windowsis 方面的 pureXML Storage 架构师,他从 2008 年春季开始居住在德国康斯坦茨湖。在此之前,他是 IBM Silicon Valley Laboratory DB2 pureXML Storage 和 Index 的开发经理和技术主管,当时他作为 DB2 开发人员在加利福利亚度享受了 7 年阳光。Henrik 经常在会议上演讲,包括各种客户站点和用户群会议。他拥有德国 University of Kaiserslautern 计算机科学的硕士和博士学位,在他 15 岁时就卖出了第一份软件。他的博客地址是 http://blog.4loeser.net



2009 年 7 月 20 日

开始之前

关于本教程

在本教程中,您将学习如何结合几个 IBM 产品创建应用程序日志的基础设施。使用 IBM solidDB(一个快速的内存数据库)作为应用程序端的缓存,以分离日志基础设施的应用程序。使用 WebSphere Message Queue 永久将消息存储并转移到 WebSphere Message Broker 中,在其中可以分析消息并将其转换成不同的 XML 输出格式。最后,在 DB2 for Linux®、UNIX® 和 Windows® 中存储消息。pureXML 功能使它能够使用本机 XML 格式存储日志文件,稍后查询和分析日志。

目标

本教程介绍应用程序日志的挑战,介绍如何在此上下文中使用 XML,如何设置能将应用程序日志带入到业务中的基础设施。

在本教程中,学习如何使用各种 IBM 工具,包括 IBM solidDB、WebSphere Message Broker 和 DB2 for Linux, UNIX, and Windows。

先决条件

本文专门针对技术和经验水平为初中级的用户。您应该对安装和使用软件有个大概了解,尤其是 DB2、WebSphere 和 solidDB。

系统需求

要设置本教程中介绍的基础设施,您需要 Windows box(Server 2003、Vista 或 Server 2008),至少 2GB 的磁盘空间,完全的管理员权限,一天中能够多次重启系统。您最好不要使用生产服务器,而是一个可以安全操作的目标系统。


应用程序日志

随着法律的不断变化(比如 Sarbanes-Oxley-Act 的出台),公司需要详细记录活动以及最新的经济变动,比如面向服务和随需应变业务,跟踪谁在企业内做了什么,因此应用程序日志正变得日益重要。

日志不再是一个在应用程序内部出现问题时进行调试的功能,而是一个让所有事务都能被跟踪和审计的永久流程。在业务关键应用程序中(比如客户数据库或 ATM 终端),日志是跟踪所有事件的关键所在。因此,必须要可靠地存储日志并能对其进行搜索。

XML 是 SOA 和 Web 服务的核心。此外,它很灵活,对于随时要增加信息、新日志类型和应用程序的日志消息,它是理想的选择。

客户通常要区分至少两种日志类型:捕获环境消息(机器类型,操作系统类型等)的技术日志和捕获所做操作的功能日志。这两种日志类型都可以混合为一个结构。

这两种类型的日志都包含了许多信息;有些部分是业务关键的,另一些只提供信息。通常,会生成大量日志文件 —— 应用程序执行的每个操作和步骤都会生成一个。因此,一个企业每月会积累成千上万个日志文件。除了量的问题之外,所有的文件都需要有效、准确地处理,不能丢失。此外,日志文件处理不能影响到客户端应用程序。

假设一个日志文件的大小在 1KB 到 20KB 之间,而每天必须处理最多 1000 万日志文件,那么每天将需要 35GB 的存储空间存储未压缩的数据,一个月将需要约 3TB 的存储空间存储未压缩数据。由于生成日志文件的客户端都在轻量级的专用硬件上运行,他们无法提供存储空间加载它们生成的日志文件。

因此,您需要使用大容量的集中存储,以便存储和分析日志文件。数据库被证明是可用于此类任务的最佳存储系统。数据库管理系统能够本机存储和查询 XML 文档,这有利于应用程序日志。清单 1 展示了一个样例 XML 文件:

清单 1. 样例 XML 文件
<?xml version="1.0" encoding="US-ASCII"?>
<File>
<Record>
<Header version="1">
<Time>2002-11-15 18:19:17.6</Time>
<Type>INFORMATION</Type>
<Id>-471559096676384768</Id>
</Header>
<Application>
<Name>SecurityWebService</Name>
<Function>GetValue</Function>
<User>JDoe</User>
<Result>3171861797959368704</Result>
<Params>
<Param>
<Type>Object</Type>
<Value>Object</Value>
</Param>
<Param>
<Type>Object</Type>
<Value>security.ssl</Value>
</Param>
<Param>
<Type>Object</Type>
<Value>0</Value>
</Param>
</Params>
<CallTime>2004-11-15 16:19:17.7</CallTime>
<StartTime>2006-10-18 12:18:14.7</StartTime>
<EndTime>2000-11-16 18:14:16.4</EndTime>
<ReturnTime>2004-11-12 10:10:12.7</ReturnTime>
</Application>
<System>
<Name>INTRANET01</Name>
<State>498308015556919296</State>
</System>

[..]

</Record>
</File>

日志发布

中央日志存储库(例如,数据库系统)可用于整合各种应用程序的活动。可以分析这些数据,形成所有应用程序的 “完整画面”。

让应用程序将其日志直接插入中央存储库是不可行的,原因有很多。要可靠地将日志信息从应用程序移动到数据库,要使用消息队列。要进一步将应用程序从消息队列中分离出来,可以使用一个小型的内存数据库系统。它还在峰值加载期间支持缓冲消息。

由于绝对不能丢失失败情况下的日志文件,日志发布中涉及的所有系统都必须是事务型的。


场景

图 1 展示您在本教程中设置的样例场景架构:

图 1. 本教程的架构
本教程的设置架构

假设有多个客户端应用程序生成日志文件并存储在 solidDB 缓冲数据库。IBM solidDB 是一个快速内存缓存数据库,它的性能得到了优化。由于它在内存中保存所有数据,除了持久性事务日志之外不会向磁盘写入任何数据,因此它既快又可靠。

然后,将使用一个 Java 工具提取日志文件并将其传输到 WebSphere Message Queue。WebSphere Message Queue 将分析文件并将其传输到 DB2 支持的数据库。

为了模拟应用程序日志客户端,该教程使用 Java 工具生成 XML 文件并将其加载到缓冲数据库。可在本文中下载工具 —— Java Load Generator Tool(见 下载)。通过运行无需命令行选项的工具,它可以打印使用信息。本教程使用该工具将消息加载到 solidDB 中。

为了将日志文件发布到后端数据库,本教程使用 IBM WebSphere Message Queue。它提供事务、持久消息队列以及路由机制,以将消息从一个位置转移到另一个位置。此外,您可以使用 WebSphere Message Broker 分析和转换消息。图 2 展示了本教程中介绍的消息流:

图 2. WebSphere 消息流
WebSphere 消息流

从两个队列读取消息,保留不同的消息格式。Queue 1 (Q1) 保留的消息由一个名为 Record 的元素组成。每个消息将路由到另一个队列 Queue (Q3) 或后端数据库。

Queue 2 (Q2) 保存由一个或多个 Record 元素组成的 File 消息。每个 File 消息能够分为一个 Record 消息及其对应的摘要消息。然后 Record 消息可以路由到后端数据库,而将在另一个队列 (Q4) 中存储 Summary 消息。

WebSphere 可以与 IBM DB2 交互,以存储消息事务。这样一来,没有消息会由于(网络)失败而丢失。IBM DB2 for Linux、UNIX 和 Windows 最终可以存储所有消息。它使用 pureXML 在专用数据结构中存储 XML 文件。这样一来,可以有效地执行查询,同时保留原来的结构。DB2 还支持压缩的 XML 文件,这将节省许多存储空间。


准备

首先,您需要下载和安装以下软件包:

  • WebSphere Message Queue 7.0
  • WebSphere Message Broker 6.1
  • WebSphere Message Broker Toolkit V6.1
  • solidDB 6.3
  • DB2 9.5 Express-C

每个软件包都应该使用默认选项安装。本教程以下几节将描述如何设置和配置这些软件。

数据库配置

为了存储日志文件,本教程使用简单的单表格方法,使用以下用于 solidDB 和 DB2 的 DDL 语句(对于生产系统,物理设计可以应用增强的特性):

表 1. 数据库定义
solidDBDB2
solidDB 表格布局DB2 表格布局
清单 2. solidDB 的 DDL 语句
CREATE TABLE LOGS (
LOGTIME TIMESTAMP,
DOC CLOB
)
清单 3. DB2 的 DDL 语句
CREATE TABLE LOGAPP.LOGS (
LOGTIME TIMESTAMP,
DOC XML
)

前端的 solidDB 不需要架构名称。对于后端 DB2,使用 LOGAPP 作为架构名称。

添加新的消息队列

从 solidDB 读取的所有消息都将存储到 WebSphere Message Queue。因此,需要使用专门的队列保存消息。

消息格式

File 和 Record 都是纯属虚构的日志文件格式,尽管它们都依赖真实的日志场景。Record 是一个日志记录,保存单个事件的信息。File 是一个或多个 Record 元素所组成的集成。 图 1 展示了一个样例文件。如果您想了解更多有关这两种格式的信息,请查看 XML 模式定义文件(参见 下载)。

如表 2 所示,您需要 5 个新的队列(注意用于 “Application Logging” 的前缀 AL_):

表 2. 消息队列
Q1: AL_INQUEUE1
Q2: AL_INQUEUE2
可以使用两个队列保存 solidDB 的输入消息。两者之间的不同之处在于保存日志文件的格式:
  • AL_INQUEUE1 保存类型为 Record 的消息。
  • AL_INQUEUE2 保存类型为 File 的消息。
Q3: AL_OUTQUEUE 该队列只是一个消息池。
Q4: AL_SUMMARYQUEUE 该队列获取所有日志摘要消息以供最终存储。
Q5: AL_XMLFILES 输入该队列的消息将插入 DB2。
图 3. 深入查看 WebSphere Message Queue Explorer
WebSphere Message Queue Explorer

现在您已经设置了工作环境并开始应用程序日志设置。

开始使用 Message Broker Toolkit

本教程使用 WebSphere Message Broker Toolkit,这是一个基于 Eclipse 的工具,用于开发消息流应用程序。当您第一次启动应用程序时,需要设置工作区文件夹用于存放所有项目文件。

图 4. 选择工作区
选择存储消息流的工作区

现在需要创建一个新的消息流项目,以保存之后开发的所有消息流项目。右键单击空的项目列表,然后选择 New > Message Flow Project

图 5. 新建消息流项目
新建消息流项目

弹出一个窗口,询问新的项目名称。输入 logApp 作为新项目的名称:

图 6. 新建消息流项目
新建消息流项目

Message Broker 连接

接下来,建立一个到之前创建的 Message Broker 域实例的连接。使用该连接,您稍后可以与 Message Broker 进行交互。要做到这一点,右键单击新建的项目,然后选择 New > Other

图 7. 新的域连接
新建到 WebSphere Message Broker 的域连接

在打开的窗口中,查找并选择项 Domain Connection

图 8. 新的域连接
新建到 WebSphere Message Broker 的连接

现在您需要输入您的 Queue Manager 名称。因为我们使用的是默认配置,它的名称为 WBRK61_DEFAULT_QUEUE_MANAGER,使用端口 2414

图 9. 新的域连接
新建到 WebSphere Message Broker 的域连接

输入 logAppConnection 作为连接名称。单击 Finish 之后,确认您希望在打开的消息框中创建一个新的服务器项目:

图 10. 新的域连接
新建到 WebSphere Message Broker 的域连接

现在连接到了 Message Broker。这对于部署和运行项目来说是必需的。

导入消息定义

消息定义

注意,您可以在本教程的 下载 一节中找到 XML 模式定义。

接下来,我们导入将在 Message Broker Toolkit 中使用的的 XML 模式定义。这样一来,WebSphere 将能够识别并解析来自 solidDB 的消息。

让我们将这两个文件导入 WebSphere Message Broker Toolkit。首先,需要将 Message Set 添加到您的项目。该集合将保存所有消息定义。

右键单击消息流项目,然后选择 New > Message Set

图 11. 新的消息集
新建消息集

接下来,为新消息集指定一个名称。因为工作区没有包含消息集项目,您还需要为新项目输入名称。这个包含新消息集的新项目将添加到您的工作集中。

将消息集命名为 logAppMessages,将项目命名为 logAppMessageSet

图 12. 新消息集
新建消息集

您需要指定新消息集保存的数据类型。因为您需要处理 XML 数据,请选择 XML 文档

图 13. 新消息集
新建消息集

现在已经输入了所有所需的信息,已经可以创建消息集了。

图 14. 新消息集
新建消息集

记住首先保存 XML 模式定义文件

您必须在本地磁盘保存文件,以便 WebSphere Message Broker Toolkit 可以访问它们。该文件包含在本教程的 下载 一节中。

该消息集将是本教程使用的所有自定义消息格式的容器。

您可以开始将 XML 模式文件导入消息集。右键单击消息集项目,然后选择 New > Message Definition File From > XML Schema File

图 15. 导入消息定义
导入消息定义

接下来,输入日志文件架构文档的路径:

图 16. 导入消息定义
导入消息定义

最后,选择希望导入的数据类型和消息。在本例中,单击 Select All 按钮选择所有对话框:

图 17. 导入消息定义
导入消息定义

您已经成功地将第一个 XML 模式定义导入 WebSphere。要将架构 LogSummary.xsd 导入工作区,请重复上述步骤。

您需要修改消息集以支持消息中的单个 Record 元素。双击工作区的 LogFile 消息定义,在右边的面板中打开定义。

图 18. 修改消息定义
修改消息定义

您需要将 RecordType 重命名为 Record,否则包含 Record 的所有根元素消息都将命名为 RecordType 而不是 Record。重命名在图 19 中完成:

图 19. 修改消息定义
修改消息定义

现在可以使用定义创建不同格式之间的映射。


使用 Java 从 solidDB 中读取消息

本节介绍如何将消息提取到队列中的一个简单样例。提供的选择很多,比如使用 JMS (Java Message Service) 连接应用程序和队列,或者使用 TCP/IP 直接连接到队列管理器。

WebSphere Message Queue 为消息队列提供了一个 JMS 接口,用于使用 Java 保存和检索消息消息。它支持事务和可靠的消息发送。因此,使用 JMS 连接有很多好处。

本教程不使用 JMS,而是使用 solidDB 作为缓存,以解耦中间件的日志应用程序和日志发布流程。

首先,您需要将日志消息从 solidDB 缓冲中传输到 WebSphere Message Queue。通常,有几种方法可以与 WebSphere 中的数据库交互。但不幸的是,solidDB 的 ODBC 驱动程序不提供对 WebSphere 的支持,而 solidDB 的 JDBC 驱动程序也不支持分散的事务。这些限制使我们只能选择使用自定义 Java 程序从 solidDB 中读取消息。

您还要确保 Java 程序或者类路径中包含 solidDB 的 jar 文件 (SolidDriver2.0.jar)。否则,您将无法连接 solidDB。

下面的清单 4 提供了连接 solidDB 的代码片段,但是在连接之前,您必须直接填写参数(host、port、user 和 pass):

清单 4. 连接到 solidDB
String connString;
connString = "jdbc:solid://" + host + ":" + port + "/" + user + "/" + pass;

Class.forName("solid.jdbc.SolidDriver").newInstance();

Connection connection = DriverManager.getConnection(connString);

Statement statement;
statement = connection.createStatement();

ResultSet resultSet;
resultSet = statement.executeQuery("SELECT doc FROM LOGS");

记住首先在连接到消息队列的所有系统上安装 WebSphere Message Queue Client。否则,您将无法连接消息队列。

清单 5 提供了另一个连接消息队列的代码清单:

清单 5. 连接 WebSphere Message Queue
String queueManagerName = "WBRK61_DEFAULT_QUEUE_MANAGER";
String queueName = "AL_INQUEUE1"; // or AL_INQUEUE2

MQQueueManager queueManager;
queueManager = new MQQueueManager(queueManagerName);

MQQueue queue;
queue = queueManager.accessQueue(
queueName, CMQC.MQOO_OUTPUT, null, null, null);

在建立了对日志消息源和日志消息池的连接之后,您需要循环输入消息并将他们都插入队列:

清单 6. 将 solidDB 中的消息传输到 WebSphere Message Queue
while (resultSet.next()) {
	byte[] message;
	message = resultSet.getBytes(1);

	MQMessage queueMessage;
	queueMessage = new MQMessage();

	queueMessage.correlationId = CMQC.MQCI_NONE;
	queueMessage.messageId = CMQC.MQMI_NONE;

	queueMessage.write(message);

	queue.put(queueMessage, queueMessageOptions);
}

注意

样例代码中没有涉及如何成功地将队列消息从缓存数据库中删除的内容。消息将仍然位于缓存数据库中,可以再次插入队列。可能需要手动删除消息。

完整的 Java 代码片段见 下载 一节。

队列中有了消息之后,可能需要执行一些操作才能将其直接保存到后端数据库。因此让我们开始学习一些如何使用 WebSphere Message Broker 修改 XML 消息的示例。


使用 WebSphere 分析和转换消息

为了使用之前创建的代理连接和导入的消息类型,您需要将引用添加到消息流项目。要选择引用的项目,请打开消息流项目 logApp 的属性页面,右键单击并选择 Properties

在打开的窗口中,选择 Project References。单击右边的选项框 —— logAppMessageSetServers

图 20. 消息流项目属性
添加项目引用

现在可以在 WebSphere Message Broker Toolkit 中创建消息流了。单击消息流项目,然后选择 New > Message Flow

图 21. 新的消息流
向项目添加消息流

输入 logFlow1 作为消息流名称,然后单击 Finish

图 22. 新的消息流
向项目添加消息流

新的消息流将在右上方的窗口中打开,因此您可以在其中添加和配置节点。您可以定义源、池、转换以及其他要对消息执行的操作。

根据内容路由消息

我们首先了解如何在流中分析消息并根据内容路由。路由可以用来分离消息类型。例如,您可以将开发人员机器和业务关键型消息调试消息(比如订单或账单信息)转发到持久存储器。

图 23 展示了将在本节中设置的消息流。MQINput 节点将从队列中读取消息。然后路由节点根据内容将消息重定向到不同的池。有些消息将使用映射节点映射到不同的格式。

图 23. 样本消息流
消息流

首先,插入可从消息队列读取消息的 MQInput 节点,然后将它们插入消息流。在窗口左边的菜单中,选择 WebSphere Message Broker,然后将 MQInput 节点拖放到右边的空窗口。

从队列中提取的消息是源单词。您需要指定要从中读取消息的队列的名称。单击新插入的节点,然后在左上方的窗口中查看属性。在字段 Queue name 中,输入 AL_INQUEUE1。正如我们提到的,AL_INQUEUE1 将保存类型为 Record 的消息。

注意

重置内容描述符是强制性的,因为 WebSphere 无法识别以 XML 形式加载到队列的位流。但是,在您显式为之前介绍的数据格式设置内容描述符之前,WebSphere 将其视为 BLOB。

下一个节点是 ResetContentDescriptor 节点(见 图 23)。该节点对于告诉 WebSphere 消息内容是 XML 而不仅仅是 BLOB 是必要的。使用以下首选项插入节点并进行配置(如图 24 所示):

  • 选择所有复选框重置消息域、重置消息集、重置消息类并充值消息格式。
  • 指定 XMLNSC 作为消息域。
  • 指定 logAppMessages 作为消息集。
图 24. ResetContentDescriptor 节点
配置 ResetContentDescriptor 节点

要查看图 24 的大图,请单击 此处

现在使用路由节点检查消息的内容并根据内容进行路由。假设该队列保存类型为 Record 的消息,您需要根据标题元素 ID 值的奇偶将它们路由到不同的输出终端。

将路由节点插入流之后,右键单击并使用上下文菜单将输入终端重命名为 OddEven

图 25. 路由节点上下文菜单
配置路由节点

接下来,向节点添加两个模式,告诉它如何路由消息。在上方的面板中选择路由节点,了解它的属性页面:

图 26. 路由节点属性页面
配置路由节点

要让路由节点的属性页面如图 26 所示,必须向筛选器表格添加两个筛选器模式。单击 Add… 打开新的对话框,可以在其中输入第一个表达式:$Body/Record/Header/Id mod 2 = 0。该模式应用于所有消息,在标题中还包含了消息 ID。在添加了第一个模式之后,重复这些步骤添加第二个模式,应用于所有偶数 ID。第二个筛选器模式:$Body/Record/Header/Id mod 2 = 1。使用该配置,到达该节点的消息将根据内容路由到一个输出终端。您现在可以将两个输出终端连接到不同的继承者。

将消息转换为不同的格式

接下来,您将使用映射节点将消息转换为另一种格式。您需要将映射节点插入到流并将其连接到一个路由节点的输出终端。连接到奇输出终端还是偶输出终端没有关系。双击新插入的节点。将出现一个新窗口,可以用来指定输入和输出消息类型:

图 27. 新消息映射
新建消息映射,选择源格式和目标格式

因为我们希望从该流中得到 Record 消息,选择 Record 作为输入类型。LogSummary 将成为输出类型,如 图 27 所示。在下一个窗口中,您可以定义映射 —— 将元素从左(输入)边拖放到右(输出)边,或者为每个元素输入映射表达式。您还可以使用图 28 下方的面板中显示的集成函数(比如 fn:concat):

图 28. 新消息映射
新建消息映射,定义映射

要查看图 28 的大图,请单击 此处

最后,您需要插入两个 MQOutput 节点以将消息写回队列。将剩下的路由节点终端连接到一个输出队列,并将映射节点的输出终端连接到第二个输出接点。您的流现在应该类似于 图 23 中的样例。最后,需要配置 MQOutput 节点并指定消息的目标队列。使用 AL_OUTQUEUE 作为连接到路由节点的 MQOutput 节点的目标,使用 AL_SUMMARYQUEUE 作为连接到映射节点的节点目标。

使用映射节点分离消息

信息

除了本节展示的解决方案之外,WebSphere 提供相对容易的方式分离和总结消息:
如果到输出终端存在多个连接,则每个消息都应用到所有连接。修改这些副本不会影响其他副本。因此,通过将两个连接添加到输出终端,可以使用一个连接传输原消息,使用另一个路由消息副本以生成摘要消息。但是,本节展示使用另一种方法来实现相同的结果。

在本节中,使用 WebSphere 将输入消息分离为几个输出消息,并根据格式将输出消息分离为不同的输出终端。假设您希望将大文件分离为更小的部分并为每个部分创建一个摘要,则如图 29 所示:

图 29. 分离和总结消息
本节将创建的消息流架构

图 30 展示了要设置的流:

图 30. 分离和总结消息
本节将创建的消息流

将使用已经介绍过的 ResetContentDescriptor 节点连接 MQInput 节点,后跟映射节点(名为 Split)。这是对之前创建流的扩展。来自第一个流的输入连接在顶部可见,附加到名为 SUMMARY 的 MQOutput 节点。您可以根据第一个图插入所有节点。MQInput 节点将从 AL_INQUEUE2 读取消息,因此您必须确保该节点的配置与 ResetContentDescriptor 节点一样。后一个节点使用的配置与 ResetContentDescriptor 相同,因此可以轻松复制。

注意

正如 XML 模式中指定的那样,元素 File 由一个或多个元素 Record 组成。

右键单击节点打开窗口,其中您可以输入源和目标消息格式,如 图 31 所示。选择 File 作为输入类型,假设队列保存该类型的消息。此时,选择两个消息作为映射/输出目标:LogSummaryRecord。这样一来,您可以将输入消息分离为多个输出消息。

图 31. 定义映射的消息类型
定义映射的消息类型

现在,对于到达该节点的每个消息,您应该将每个内部 Record 元素映射到自己的消息,并为每个 Record 生成一个摘要消息 (LogSummary)。图 32图 33 展示映射。下面屏幕截屏中的 for 表达式在输入中迭代 Record 元素并为每个元素生成一个单独的输出消息。

图 32. 映射节点视图
映射节点视图

要查看图 32 的大图,请单击 此处

图 33. 映射节点详细信息
映射节点视图

要查看图 33 的大图,请单击 此处

提示

for 表达式可以用来迭代输入中的重复元素。

在映射和分离之后,您需要处理一个问题:Record 和 LogSummary 这两个消息类型都将输出到相同的输出终端。您需要将这两个消息分离为不同的流。使用 JavaCompute 节点处理这个问题。将节点插入到流之后,双击打开帮助新建 Java 项目的助手。将自动生成的代码替换为清单 7 中的样例代码。(该代码包含在 下载 一节)。

清单 7. 使用 JavaCompute 路由消息
public class JavaRouteNode extends MbJavaComputeNode {
	public void evaluate(MbMessageAssembly assembly) throws MbException {
		MbOutputTerminal out = getOutputTerminal("out");
		MbOutputTerminal alt = getOutputTerminal("alternate");

		MbMessage message = assembly.getMessage();

		MbElement logMessage = message.getRootElement().getLastChild();

		if (logMessage.getFirstElementByPath("./Record") != null) {
			// Message is a complete log record
			out.propagate(assembly);
		} else if (logMessage.getFirstElementByPath("./LogSummary") != null) {
			// Message is a summary
			alt.propagate(assembly);
		}else{
			throw new IllegalArgumentException();
		}
	}
	}

注意

除了使用 JavaCompute 节点外,还可以使用路由节点。但是,很高兴有多种方法与 WebSphere 中的消息交互。

每个消息都调用该节点,它执行两个 XQueries 确定消息是 Record 还是 LogSummary。根据 XQuery 的结果,消息将发送输出终端或可替换终端(另一个输出终端)。

现在介绍如何使用 WebSphere 以几种方式路由、转换和分析消息。接下来,了解如何存储队列中等待进入后端数据库的某些消息。


将消息保存到 DB2

连接 DB2

注意

WebSphere 提供各种方法连接数据库。本教程使用 ODBC 只是为了简便。要使用另一个连接方法,请参考 WebSphere Message Broker Information Center(见 参考资料)。

要将消息直接从 WebSphere Message Queue 写入 DB2,您需要首先设置连接到目标数据库的 ODBC 连接。

要添加新的 ODBC 连接,必须在 Windows 控制面板中打开 ODBC 数据源配置。

单击 Add… 新建一个到数据库的 ODBC 连接:

图 34. ODBC 数据源管理器
ODBC 数据源管理器

因为您需要连接到默认的 DB2 实例,请选择 IBM DB2 ODBC DRIVER – DB2COPY1

图 35. 新建 ODBC 数据源
新建 ODBC 数据源

在下一个窗口中,输入 LOGAPPDB 作为数据源名称,然后单击 Add 按钮:

图 36. 新建 ODBC 数据源
新建 ODBC 数据源

现在需要输入 WebSphere 将用来连接数据库的用户名和密码。确保您勾选了 Save password 复选框。

图 37. 新建 ODBC 数据源
新建 ODBC 数据源

在下一个面板中,输入数据库名称、它的主机名和端口。

由于 WebSphere Message Broker 和 DB2 驻留在同一台机器上,您可以输入 localhost 作为主机名。单击 OK 之后,可以关闭所有打开的 ODBC 窗口然后返回 WebSphere Message Broker Toolkit。

图 38. 新建 ODBC 数据源
新建 ODBC 数据源

导入数据库布局

配置数据库连接之后,需要通知 WebSphere 数据库表格布局。要做到这一点,可以直接从 DB2 导入数据库布局 —— 添加到 Message Broker Toolkit 的连接。在 Broker 应用程序开发视图中,切换到 Database Explorer 选项卡并新建数据库连接。将弹出一个窗口,其中可以指定连接参数。

使用我们的参数填写表单后,可以单击 Finish

图 39. 在 WebSphere Message Broker Toolkit 中创建数据库连接
在 WebSphere Message Broker Toolkit 中创建数据库连接

现在连接到了数据库。接下来,必须将数据库定义导入 WebSphere 以支持到数据库表格的消息映射。右键单击项目列表,然后选择 New > Database Definition

图 40. 新数据库定义
在 WebSphere Message Broker Toolkit 中创建数据库连接

打开新窗口。项目列表为空,因为项目列表不包含任何数据设计项目。单击 New 添加数据设计项目,用于保存数据库定义。

命名新项目 databaseDefinitions 然后单击 Next

图 41. 新数据设计项目
创建数据设计项目

您不需要选择任何对其他项目的引用,因此直接单击 Finish

图 42. 新数据设计项目
创建数据设计项目

创建数据设计项目之后,需要回到数据定义窗口。已经选好了新创建的项目名称。确保选择正确的 DB2 版本:

图 43. 新数据库定义
在 WebSphere Message Broker Toolkit 中创建数据库连接

在下一个窗口中,选择之前创建的数据库连接:

图 44. 在 WebSphere Message Broker Toolkit 中创建数据库连接
在 WebSphere Message Broker Toolkit 中创建数据库连接

现在,输入用户 ID 和密码连接到数据库:

图 45. 新数据库连接
在 WebSphere Message Broker Toolkit 中创建数据库连接

WebSphere 连接到数据库并检索所有架构列表。选择 LOGAPP 架构:

图 46. 新数据库定义
在 WebSphere Message Broker Toolkit 中创建数据库连接

在下一个窗口中,至少选择表格定义:

图 47. 新数据库定义
在 WebSphere Message Broker Toolkit 中创建数据库连接

导入表格定义之后,可以使用表格处理消息流了。

创建流

现在,您可以创建一个从消息队列 (AL_XMLQUEUE) 中读取消息并将其存储到 DB2 的新流。

流的名称为 storageFlow。它由三个节点组成:MQInput 节点用于从 AL_XMLQUEUE 中读取消息;之后是 ResetContentDescriptor 节点和 DatabaseInsert 节点。图 48 展示了流布局:

图 48. 将消息存储到 DB2 的消息流
将消息存储到 DB2 的消息流

单击 DatabaseInsert 节点(图 48 中名为 Backend),并切换到基本属性。输入之前创建的 ODBC 数据源 (LOGAPPDB) 的名称。邮件单击新的 DatabaseInsert 节点。将出现一个新窗口,询问输入和输出消息格式。选择 Record 作为输入消息类型,选择数据库表格 LOGS 作为输出目标:

图 49. 存储流的新消息映射
创建消息映射

在映射窗口中,可以将元素从表格列的左边拖放到右边。因为 WebSphere 不知道 DB2 的新 pureXML 特性以及存储 XML 的功能,您不能将复杂的类型拖动到列中。通过该操作,WebSphere 可以创建一个子映射(假设您需要将复杂类型的特定部分映射到一个列中)。WebSphere 期望您连接或汇总子元素以适应单个数据库列。

要将整个元素及其子元素映射到数据库列,需要使用能序列化整个文档的功能。这可以使用 esql:asbitstream($source/Record) 完成,如图 50 所示:

图 50. 消息映射视图
将消息映射到数据库表格

您已经开发了所有必要的消息流节点,该项目应该能够运行在 Message Broker 上。

注意:将项目部署到 Message Broker 不在本文讨论之列。要获取如何创建 Broker Archive (BAR) 和在 Message Broker 中部署的信息,请参考 WebSphere Message Broker Information Center。


结束语

本教程展示了如何使用几个 IBM 产品设置应用程序日志的基础设施。将 IBM solidDB 作为内存缓存以分离应用程序和日志基础设施。WebSphere Message Queue 和 WebSphere Message Broker 用于发布、分析和转换 XML 消息。最后,DB2 for Linux、UNIX 和 Windows 及其 pureXML 特性用于有效存储和管理 XML 数据。没有单个产品能够提供完整的日志基础设施,但是,正如本教程所述,快速地构建这样一种应用程序日志基础设施是可能的。XML 是核心部分,因为它能够灵活地更改和添加消息格式,而不会影响基础设施本身。使用 DB2 及其 SQL/XML 和 XQuery 支持,可以查询 XML 数据进行失败分析和审计分析。


下载

描述名字大小
XML 模式定义文件(文件)LogFile.xsd4KB
ToXgene 模板文件1LogFile.tox7KB
XML 模式定义文件(摘要)LogSummary.xsd2KB
代码2JavaRouteNode.java2KB
solidDB 和 MQ 连接代码3solidDB2MQ.java2KB
Java Load Generator Tool4LoadGenerator.jar5MB

注意:

  1. 这是用来生成日志文件的样例 ToXgene 文件。
  2. 这是 WebSphere Message Broker JavaRouteNode 的样例代码。
  3. 这是连接 solidDB 和 WebSphere Message Queue 的样例代码。
  4. 这是生成日志文件并将其加载到 solidDB 和 DB2 的工具。

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management, WebSphere, XML
ArticleID=414964
ArticleTitle=使用 solidDB、WebSphere Message Broker 和 DB2 pureXML 实现应用程序日志
publish-date=07202009