在 WebSphere Message Broker V6 中使用 Java

发表于:2007-05-24来源:作者:点击数: 标签:messageBrokerwebsphere使用
本文介绍 WebSphere Message Broker V6 中增强的 Java 支持,重点关注新的 JavaCompute 节点,该节点简化了 Java 在消息流应用程序开发中的使用。本文还列举了大量的参考资料,可以帮助您在 WebSphere Message Broker 中学习和使用 Java。 JavaCompute 节点
本文介绍 WebSphere Message Broker V6 中增强的 Java 支持,重点关注新的 JavaCompute 节点,该节点简化了 Java 在消息流应用程序开发中的使用。本文还列举了大量的参考资料,可以帮助您在 WebSphere Message Broker 中学习和使用 Java。

JavaCompute 节点


图 1. JavaCompute 节点
图 1. JavaCompute 节点

新的 JavaCompute 节点显著地改进了 Java™ 在 IBM® WebSphere® Message Broker V6 中的使用,它允许为消息流应用程序直接编写 Java 源代码。其替代方法是在 ESQL 中编写相关的逻辑,并从 ESQL 中调用 Java 过程,或编写自定义的处理节点。这两种方法仍然是有效的选择,但是 JavaCompute 节点是在 WebSphere Message Broker V6 中使用 Java 的推荐方式。其巨大的优势在于,为 JavaCompute 节点开发的代码可以部署到代理运行时中,而代理运行时使用相同机制来部署消息流、消息集和 ESQL 逻辑。这个功能为您提供了与使用 ESQL 开发消息流类似的体验。

JavaCompute 节点还通过基于 XPath 1.0 语法的消息处理扩展了现有的 Java API。在工具包中为这些节点开发 Java 代码,可以充分利用 Java 开发环境,该开发环境内置在 Rational Application Developer 中,并且提供了内容辅助、重构工具和其他一些有价值的特性。另外,还包括了 JavaCompute 节点向导,该向导使用模板类来初始化 Java 项目,并引用所需的依赖项。JavaCompute 节点支持使用外部类,允许重用消息流中使用 Java 编写的现有业务逻辑。

具有 Java 技能的开发人员可以使用全面支持开发过程的环境和部署模型中的工具包,从而使用 JavaCompute 节点以纯 Java 代码的方式编写流逻辑。

JavaCompute 节点的功能

JavaCompute 节点可用于:

  • 根据消息内容对消息进行路由
  • 在消息通过该节点时丰富其内容
  • 创建新的输出消息
  • 使用 Java 语言提供的其他功能

以下几部分将重点关注这些功能的技术层面:JavaCompute 节点的创建、开发和部署。

为 JavaCompute 节点创建节点

JavaCompute 节点需要一个在 Java 项目中实现的扩展 com.ibm.broker.javacompute.MbJavaComputeNode 类的 Java 类。对 MbJavaComputeNode 类所进行的扩展必须实现 evaluate 方法,该方法提供了用于对该节点接收到的消息进行处理的逻辑。Java 项目还必须包含对实现 Message Broker 的 JavaCompute 节点 API 的 jar 文件(javacompute.jarjplugin2.jar)的引用。除了使用模板类来初始化 Java 项目和引用其所需的依赖项之外,JavaCompute 节点向导还可以执行大部分的设置工作,并向您提示相应的名称和对模板的选择。在为消息流添加了 JavaCompute 节点之后,您必须完成下面的步骤,以调用并执行相应的配置:

  1. 右键单击该节点并选择 Open Java。这将打开 JavaCompute 节点向导。
  2. 提供一个 Java 项目名称。为 JavaCompute 节点开发创建并初始化该项目。
  3. 为新的 Java 类提供一个名称。
  4. 为节点类选择一个模板:
    • 消息筛选类,用于在消息流中根据消息的内容对其进行路由。
    • 消息修改类,用于在消息通过该节点时对其进行修改。
    • 消息创建类,用于创建由流进行传播的新消息。
  5. 在选择了模板之后,工具包中的透视图将会切换到 Java 透视图,并将根据所选择的模板显示相应的代码。现在,可以编写这个新的节点所需要的逻辑。

图 2. JavaCompute 节点配置向导
图 2. JavaCompute 节点配置向导

下面显示的是在选择了第一个筛选模板时的代码:


图 3. JavaCompute 节点模板
图 3. JavaCompute 节点模板

然后,您可以使用 Eclipse 中的内容辅助功能来开发这个类。

关联现有的代码

在开发了 JavaCompute 节点类之后,可以将其重用于后续节点。要完成这项任务,只需将新的 JavaCompute 节点拖放到消息流上,然后从该节点的属性中选择现有的类类型。

消息处理

JavaCompute 节点可以提供具有路由和转换逻辑的消息流。对可用的路由和转换功能摘要描述如下。

在流中进行路由

在消息流中对消息进行路由的能力提供了流决策点,从而可以为任何给定的消息选择替代的处理和目标。在流中对消息进行路由有两种可用的方法,即通过节点终端或路由到标签 (route-to-label) 方法。

使用 Out 和 Alternate 终端进行路由


图 4. 使用 Out 和 Alternate 终端进行路由
图 4. 使用 Out 和 Alternate 终端进行路由

通过两种输出终端,JavaCompute 节点包含了双向路由功能,它们在工具包中分别标识为“Out”和“Alternate”终端。下面的代码片段获得了这些终端,以便能够在该方法中对其进行传播。在 Java 代码中引用这些终端时,首字母需要小写:

public void evaluate(MbMessageAssembly assembly) throws MbException
            {
            MbOutputTerminal out = getOutputTerminal("out");
            MbOutputTerminal alt = getOutputTerminal("alternate");
            

然后使用下面的代码将所接收的消息传播到 Out 终端:out.propagate(assembly);

同样,要筛选一些将传播到 alternate 终端的消息,可以在 alt 对象中调用 propagate 方法。要立即释放节点中创建的任何 MbMessage 对象所使用的内存,始终可以在从计算返回之前,对它们调用 clearMessage 方法。

要创建一个筛选类型的节点,可以在 JavaCompute 节点创建向导中选择 Filtering Message Class 模板。

RegexFilterNode 和 RoutingFileNode 示例演示了这个功能。本文中引用的所有示例都来自于 WebSphere Message Broker V6。

RouteToLabel

如果仅路由到两个终端还不够的话,那么在产品的其他部分中,您可以使用 RouteToLabel 方法。这个流展示了一个示例,其中 JavaCompute 节点确定 RouteToLabel 节点将消息传播到哪一个标签节点:


图 5. 使用路由到标签的方式进行路由
图 5. 使用路由到标签的方式进行路由

对消息进行转换

对消息进行转换包括导航输入消息并创建经过修改的或新的输出消息。

导航输入消息

导航任何节点接收的消息需要基于消息的路由和转换。下面的消息将在后面的代码段中使用,它展示了用于导航消息的技巧。下面的 XML 文档以经过解析的消息树的格式呈现:

            <document>
            <chapter title='Introduction'>
            Some text.
            </chapter>
            </document>
            


图 6. 对示例文件进行解析所得到的消息树
图 6. 对示例文件进行解析所得到的消息树

Key 中包含了用于导航消息树的 MbElement 类的可用 Java 方法的细节。

也可以使用一些采用 XPath 1.0 语法的方法,但是在此图中没有对其进行说明。

MbElement 导航

这段 Java 代码对文档进行访问,然后访问逻辑树中的第一个 chapter 元素:

            MbElement root = assembly.getMessage().getRootElement();
            MbElement document = root.getLastChild().getFirstChild();
            MbElement chapter = document.getFirstChild();  // returns the first chapter
            

JavaComputeTransformNoXPath 示例演示了这个功能。

XPath 1.0 导航

您还可以使用 XPath 语法来检索消息的内容。下面的 Java 代码使用 XPath 语法访问逻辑树中的第一个 chapter 元素:

            MbMessage msg = assembly.getMessage();
            // the following returns a list of all chapters in the document using an XPath
            // expression.
            List chapters= (List)msg.evaluateXPath("/document/chapter");
            MbElement chapter = (MbElement)chapters.get(0);  // returns the first chapter
            

WebSphere Message Broker V6 中附带的 JavaComputeTransformXPath 示例演示了这个功能。

创建输出消息

同样,您可以使用 API 和 XPath 语法模型来创建输出消息。

MbElement 的创建

通过与访问消息树元素类似的方式,对于特定的 MbElement,您还可以访问 create 方法并使用它们来创建孩子和兄弟元素。下面的代码创建了 title 元素作为 chapter 元素的第一个孩子:

	MbElement title = chapter.createElementAsFirstChild(MbXML.ATTRIBUTE,
            "title",
            "Introduction");
            

WebSphere Message Broker V6 中附带的 JavaComputeTransformNoXPath 示例演示了这个功能。

XPath 的创建

XPath 支持包括以类似 XPath 的语法创建元素的 XPath 扩展。例如,"/?title[set-value(‘Introduction’)]" 将创建一个 title 元素并设置它的值。

下面的代码添加 title 元素并设置它的值(对于给定的包含 document 和 chapter 元素的消息):

	message.evaluateXPath("/document/chapter/?@title[set-value('Introduction')]");

WebSphere Message Broker V6 中附带的 JavaComputeTransformXPath 示例演示了这个功能。

配置节点

有许多机制可以用于配置 JavaCompute 节点:

  • 用户定义属性(V6 中的新特性)
  • 该节点接收的消息
  • 代理属性
  • 文件

下面几部分将详细描述这些技巧。

用户定义属性

用户定义属性是 V6 中为消息流节点提供流级别配置的新机制。在 JavaCompute 节点中,将其称为用户定义属性,在为 getUserDefinedAttributes 方法提供了属性名称后,它将返回该属性在流中所设置的值。这些设置是针对流级别的,而不是针对单独的节点的,所以可以通过流中所有的 JavaCompute 和 Compute 节点来访问相同的属性。


图 7. 用户定义属性
图 7. 用户定义属性

对于前面的流,您可以使用下面的 Java 调用来访问属性:

            String regexValue = (String)getUserDefinedAttribute("filterRegex");
            String fieldValue = (String)getUserDefinedAttribute("filterField");
            

WebSphere Message Broker V6 中附带的 RegexFilterNode 示例演示了这个功能,并且在本部分中使用这个示例进行了说明。

消息

消息在通过节点时可以用来进行动态配置。您可以访问 EnvironmentLocalEnvironment 以及消息正文,从而为这种配置的设置提供各种各样的方法。然后,您可以将这些设置保存在类的静态成员中,以便后续的消息可以使用其值。在每次启动执行组或部署消息流时,静态变量将恢复为其缺省值。

代理属性

Java API 提供了大量的代理属性,用于检索代理、执行组和具有运行的节点的消息流的细节信息。下面的代码用于检索这些资源的名称,还可以使用这里没有列举的其他值。

            String messageBrokerName 		= getBroker().getName();
            String messageExecutionGroupName 	= getExecutionGroup().getName();
            String messageFlowName 		= getMessageFlow().getName();
            

同样,您可以使用这些代理属性来提供与环境相关的配置。

文件

Java Compute 节点可以使用标准的 java.io 类(也可用于配置该节点)来访问运行时系统。另外,Java 代码可以对部署于 jar 中的文件以及 Java 类文件进行访问。Routing File Node 示例演示了这个功能。

调用 Java 依赖项

为 JavaCompute 节点开发的 Java 类可以调用现有的 Java 类。为了使 Message Broker 运行时引用 jar 文件,必须将其放置在下列位置其中之一:部署于代理存档文件;复制到 <Work Path>/shared-classes;,或出现在 Message Broker 的 CLASSPATH 中。GoogleAPINode 和 NewsGroupGetNode 示例演示了这个功能。

数据库支持

有两种方法可以提供数据库访问:

  • MbSQLStatement,这是 Java API 中的一个类,它提供了对由 Message Broker 管理的 ODBC 数据源的访问。这种数据访问方法提供了事务完整性,即对更新、删除和插入操作与消息流中其他部分进行协调处理。
  • Type 4 JDBC 驱动程序——不对使用这个接口所执行的更新操作与其他资源进行协调处理,也可以在消息流中执行更新操作。

部署包含 JavaCompute 节点的流

部署工作是将数据传输到代理中的执行组的过程,所以它可以在代理域中生效。为了部署消息流和关联的 JavaCompute 类,可以将这些资源打包到一个代理存档 (bar) 文件中,这是常规部署过程中的一部分。不需要任何 JavaCompute 节点特定的附加步骤。向 bar 文件中添加包含 JavaCompute 节点的流,也会触发将这些 Java 类打包到 Java 存档 (jar) 文件的操作,然后将 Java 存档文件包含到 bar 文件中,随后可以将该 bar 文件部署到代理中。

当将 jar 文件部署到代理中时,它和消息流一同出现在工具包的 Domains 视图中,如右边所示。V6 还为 jar 文件提供了版本控制和关键字支持,并且这项支持可以使用 jar 文件内嵌入的文件 (META-INF/keywords.txt) 中的设置。


图 8. 部署的 JavaCompute 节点
图 8. 部署的 JavaCompute 节点

调试

要在 Message Broker Toolkit 中对节点进行调试,首先需要为运行 Message Broker 的 JVM 设置一个调试端口。可以使用下面的命令语法,它需要代理名称、执行组和端口号:

            mqsichangeproperties <Broker Name> -e <Execution Group Name>
            -o ComIbmJVMManager -n jvmDebugPort -v <Port Number>
            

重新启动执行组以使该设置生效。当在工具包中设置 Message Broker 调试会话时,需要输入 Java 调试端口。要仅重新启动执行组,可以使用下面的命令:

mqsireload <Broker Name> -e <Execution Group Name>

JavaCompute 节点示例

WebSphere Message Broker V6 附带了一个由五个消息流和对应的 JavaCompute 节点类组成的示例,该示例演示了这个节点的功能:

  • RegexFilterNode 示例——演示了如何能够将 JavaCompute 节点作为筛选节点使用,以及如何使用用户定义属性。
  • RoutingFileNode 示例——演示了如何能够将 JavaCompute 节点作为筛选节点使用,并且从外部源(在本示例中是一个属性文件)加载相应的筛选规则。
  • JavaComputeTransform 示例——演示了如何通过读取输入消息和产生新的输出消息来将 JavaCompute 节点用于处理简单的清单。
  • GoogleAPINode 示例——演示了 JavaCompute 节点如何调用外部服务并根据调用的结果生成新的消息。
  • NewsGroupGetNode 示例——演示了 JavaCompute 节点如何调用外部 API 并使用调用的结果对传入的消息进行扩充。

SampleUtils.java 中还包括用于添加最小限度的 MQMD 或 RFH2 Header 的示例实用方法。

JavaCompute 节点的性能

Java 支持建立在优于 ESQL 的高效实现的基础之上。下面的表格详细描述了在使用 XPath 语法方法的 Compute 节点内,在 JavaCompute 节点和 ESQL 中实现等价功能时的消息吞吐量。这个示例很简单,它说明了从 Java 的观点来看的最差情况的比较,因为在消息流中几乎没有对业务逻辑进行编码。在实际情况下,可能具有更大比例的业务逻辑,因此运行 Java 的优势将更加明显。


表 1. 在执行相同的消息处理时,ESQL 和 Java 实现的消息吞吐量的比较
任务ESQL 消息数/秒JavaCompute消息数/秒JavaCompute 占 ESQL 的百分比
对输入消息进行计算 886 793 90%
对输入消息进行操作 866 720 80%
对第一个元素进行筛选 2443 2221 90%

记录这些数值的实验环境为 IBM xSeries 360 服务器、4 x 2GHz Intel Xeon 处理器、3.5 GB RAM、Microsoft Windows 2000 (SP4),并且使用非持久性的 1K 字节的 XML 消息。

正如您所看到的,Java 实现要优于 ESQL 实现,这是因为在许多消息代理场景中,大部分的处理工作是解析和访问消息中的元素。无论使用何种语言来编写逻辑,都通过相同的基础 XML 解析器完成这项处理工作。有关性能改进和获得这些数值时使用的测试用例的更详细的信息,请参阅 performance reports for WebSphere Message Broker V6

z/OS 用户可以通过使用具有 IBM System z 应用辅助处理器 (zAAP) 的 JavaCompute 节点来降低成本。可以将在 JavaCompute 节点类中完成的任何工作卸载到 zAAP 处理器中。然而,与 WebSphere Message Broker 消息解析器相关的处理工作和序列化不适合于在 zAAP 上运行。

WebSphere Message Broker 中的附加 Java 支持

用户定义扩展

用户定义扩展是在 Message Broker 中编写作为节点运行的代码的另一种方法。使用这种方法开发的节点,可以指定终端的数目和名称、该节点的属性,以及该节点是否作为流的输入节点。然而,用户定义扩展的类必须安装在运行时中。它们无法从 JavaCompute 节点的类部署机制中获益。

Par 文件(V6 中新的文件)允许将用户定义扩展的类和依赖项打包到一起并作为一个整体安装到 Message Broker 中。

配置管理程序 API

配置管理程序 API 是配置管理程序的 Java 接口,它允许您以编程的方式控制代理域。它是 Message Broker Toolkit 所使用的接口,所以在 Java 应用程序中,可以创建和部署执行组,或者终止和启动消息流。为了提供这种支持,该 API 使得 WebSphere MQ 客户端连接到运行配置管理程序的队列管理器。安装中包含的“Configuration Manager Proxy API Exerciser”示例演示了该 API 的所有功能。下面的应用程序屏幕截图在它的左边显示了这个域中的资源,从配置管理程序直到消息流。窗口的右边提供了所选择的消息流的详细信息。


图 9. Configuration Manager Proxy API Exerciser
图 9. Configuration Manager Proxy API Exerciser

结束语

本文描述了 WebSphere Message Broker V6 中的扩展 Java 支持,重点关注新的 JavaCompute 节点的功能。本文介绍了如何为这种节点创建 Java 代码,以及如何轻松地将其部署到 Message Broker。通过将路由和转换功能与优良的性能相结合,使得完全使用 Java 语言编写其逻辑的消息流成为那些具有 Java 技能的开发人员的实际选择。如果 Java 业务逻辑已经存在,您可以在这些节点之一中进行重用。本文还描述了 WebSphere Message Broker 新的发布版中的一些附加增强 Java 支持。有关 WebSphere Message Broker V6 中的 Java 支持及其相关技术的详细信息,请参见下面的“参考资料”部分。

原文转自:http://www.ltesting.net