使用 Java 创建消息处理或输出节点

开始之前

WebSphere Message Broker 为称为 SwitchNode 和 TransformNode 的两个用户定义的样本节点提供了数据源。您可以使用当前状态下的这些节点,也可以修改这些节点。

在概念上,消息处理节点用于按相同方法处理消息,输出节点用于将消息输出为位流。但是,当您编码消息处理节点或输出节点时,它们本质上是相同的东西。您可以在输出节点中执行消息处理,同样您可以使用消息处理节点将消息输出到位流。为简便起见,本主题在提到节点时大都指的是消息处理节点,不过本主题依然会讲述这两类节点的功能。

创建新的 Java 项目

您可在 工作台 中创建 Java 节点。 要完成这点,您必须按照以下所述新建一个 Java 项目:
  1. 切换到 Java 透视图。
  2. 单击文件 > 新建 > 项目。 从左边的菜单中选择 Java,然后从右边的菜单中选择 Java 项目
  3. 为该项目命名。

    显示“Java 设置”面板。

  4. 选择“库”选项卡,然后单击添加外部 JAR
  5. 选择 install_dir\classes\jplugin2.jar。
  6. 按照其他选项卡上的提示定义任何其他构建设置。
  7. 单击完成
然后,您可以在此项目中开发用于您的 Java 节点的源代码。

声明消息处理节点类

任何实现 MbNodeInterface 且包含在代理的 LIL 路径中的类都在代理中注册为消息处理节点。当您实现 MbNodeInterface 时,您还必须为此类实现 evaluate 方法。代理为每条经过这个流的消息调用 evaluate 方法。

例如,要声明消息处理节点类:
package com.ibm.jplugins;

import com.ibm.broker.plugin.*;

public class BasicNode extends MbNode implements MbNodeInterface
您可以在工作台中做到这点,如下所示:
  1. 单击文件 > 新建> 类
  2. 将包与类名字段设置为相应的值。
  3. 删除“超类”文本字段中的文本然后单击浏览按钮
  4. 选择 MbNode 后单击 确定
  5. 单击“接口”文本字段旁的添加按钮,然后选择MbNodeInterface
  6. 单击完成

定义节点构造函数

当实例化节点时,将调用用户的节点类的构造函数。这是您创建节点的终端并初始化属性的任何缺省值的地方。

消息处理节点有许多个与它关联的输入终端和输出终端。当实例化节点时,方法 createInputTerminalcreateOutputTerminal 用于将终端添加到节点。例如,要创建带有一个输入终端和两个输出终端的节点:

public MyNode() throws MbException
{
		// create terminals here
		createInputTerminal ("in");
	createOutputTerminal ("out");
	createOutputTerminal ("failure");
}

访问消息数据

在许多情况下,用户定义的节点需要访问在它的输入终端上接收到的消息的内容。消息由语法元素的树表示。提供了 evaluate 方法使用的多组实用程序函数,这些函数用于消息管理、消息缓冲区访问、语法元素导航和语法元素访问。

MbElement 类提供了到语法元素的接口。有关 Java API 的进一步详细信息,请参阅 Javadoc。

例如:

  1. 要浏览到 XML 消息中的相关语法元素:
        MbElement rootElement = assembly.getMessage().getRootElement();
            MbElement switchElement = 
    rootElement.getLastChild().getFirstChild().getFirstChild();
  2. 要选择此元素的值表明的终端:
        String terminalName;
        String elementValue = (String)switchElement.getValue();
            if(elementValue.equals("add"))
                terminalName = "add";
            else if(elementValue.equals("change"))
                terminalName = "change";
            else if(elementValue.equals("delete"))
                terminalName = "delete";
            else if(elementValue.equals("hold"))
                terminalName = "hold";
        else
                terminalName = "failure";
        
            MbOutputTerminal out = getOutputTerminal(terminalName);

转换消息对象

接收到的输入消息是只读的,因此在消息可被转换之前,您必须将它写到新的输出消息。您可以从输入消息复制元素,或者您可以在输出消息中创建新元素。 新的元素通常在解析器的域中。

MbMessage 类提供了副本构造器,以及获取消息的根元素的方法。MbElement 类提供了到语法元素的接口。

例如,在带有嵌入式消息的进入消息集合的地方,您可能在用户定义节点的 evaluate 方法中有以下代码:
  1. 要创建消息集合及其嵌入式消息的新副本:
            MbMessage newMsg = new MbMessage(assembly.getMessage());
            MbMessageAssembly newAssembly = new MbMessageAssembly(assembly, newMsg);
  2. 要浏览到 XML 消息中的相关语法元素:
        MbElement rootElement = newAssembly.getMessage().getRootElement();
            MbElement switchElement = 
    rootElement.getFirstElementByPath("/XML/data/action");
  3. 要更改现有元素的值:
      String elementValue = (String)switchElement.getValue();
            if(elementValue.equals("add"))
                switchElement.setValue("change");
            else if(elementValue.equals("change"))
                switchElement.setValue("delete");
            else if(elementValue.equals("delete"))
                switchElement.setValue("hold");
        else
                switchElement.setValue("failure");
  4. 要将新标记添加为 switch 标记的子代:
        MbElement tag = switchElement.createElementAsLastChild(MbElement.TYPE_NAME,
                                                                                                                          "PreviousValue",
                                                                                                                          elementValue);
  5. 要将属性添加到此新的标记:
        tag.createElementAsFirstChild(MbElement.TYPE_NAME_VALUE,
                                                                        "NewValue",
                                                                        switchElement.getValue());
    
            MbOutputTerminal out = getOutputTerminal("out");
作为转换的一部分,可能需要创建一个新的消息体。要创建一个新的消息体,可以使用以下方法:
createElementAfter(String)
createElementAsFirstChild(String)
createElementAsLastChild(String)
createElementBefore(String)
createElementAsLastChildFromBitstream(byte[], String, String, String, String, int, int, int)
应该使用这些方法,因为它们是专门用于将解析器分配给消息树文件夹的。
创建消息体时,不要使用以下方法,因为它们不将拥有的解析器与文件夹关联起来。
createElementAfter(int)
createElementAfter(int, String, Object)
createElementAsFirstChild(int)
createElementAsFirstChild(int, String, Object)
createElementAsLastChild(int)
createElementAsLastChild(int, String, Object)
createElementBefore(int)
createElementBefore(int, String, Object)

传播消息

在您传播消息之前,您必须确定您要传播的消息流数据,以及用于接收数据的节点的终端。

例如:
  1. 要将消息传播到输出终端“out”:
        MbOutputTerminal out = getOutputTerminal("out");        out.propagate(newAssembly);

要清空分配给该消息树的内存,调用最后一个 try/catch 程序段中的 clearMessage() 函数。

声明节点名称

您需要声明节点的名称,因为它将由工作台标识。所有节点名称必须以“Node”结尾。您使用下列方法声明此名称:

public static String getNodeName()
{
      return "BasicNode";
}
如果没有声明此方法,Java API 框架使用下列规则创建缺省节点名称:
  • 类名附加到软件包名称。
  • 点被除去,且软件包和类名的每部分的第一个字母是大写的。
例如,缺省情况下,以下类指派节点名称“ComIbmPluginsamplesBasicNode”:
package com.ibm.pluginsamples;
public class BasicNode extends MbNode implements MbNodeInterface
{
   ...

声明属性

您使用与 Java Bean 属性相同的方法声明节点属性。您负责编写属性的 getter 和 setter 方法,且 API 框架使用 Java 自省规则推断属性名。例如,如果您声明下列两个方法:

private String attributeVariable;

public String getFirstAttribute()
{
    return attributeVariable;
}

publc void setFirstAttribute(String value)
{
    attributeVariable = value;
}

代理推断此节点有一个称为 firstAttribute 的属性。此名称从 get 或 set 方法的名称派生而来,而不是从任何内部类成员变量名称派生而来。属性只能以字符串的形式显示,因此您必须在 get 或 set 方法中将任何数字类型转换为字符串或将字符串转换为数字类型。例如,下列方法定义称为 timeInSeconds 的属性:

int seconds;

public String getTimeInSeconds()
{
    return Integer.toString(seconds);
}

public void setTimeInSeconds(String value)
{
    seconds = Integer.parseInt(value);
}

实现节点功能

如之前描述的那样,对于消息处理或输出节点,您必须实现在 MbNodeInterface 中定义的 evaluate 方法。代理调用此方法来处理消息。此方法应该提供节点的所有处理功能。

evaluate 方法有两个在代理中传递的参数:
  1. 包含下列对象的 MbMessageAssembly 使用相应的方法的访问:
    • 进入消息
    • 本地环境
    • 全局环境
    • 异常列表
  2. 消息到达的输入终端。
例如,以下代码摘录显示了如何编写 evaluate 方法:
public void evaluate(MbMessageAssembly assembly, MbInputTerminal inTerm) throws MbException
  {
    // add message processing code here

    getOutputTerminal("out").propagate(assembly);   }

消息流数据由消息、全局环境、本地环境和异常列表组成,可以在节点的输入终端上接收。

删除节点实例

当发生下列情况之一时,将删除节点的实例:
  • 关闭代理。
  • 除去包含节点的节点或消息流,然后重新部署配置。
在节点删除期间,节点可能想要被通知,以便它可以执行任何清除操作(例如,关闭套接字)。如果节点实现可选的 onDelete 方法,代理仅在删除节点之前调用此方法。

您按如下所示实现 onDelete 方法:

public void onDelete()
{
    // perform node cleanup if necessary
}
相关参考
异常列表结构
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
as09970_