显示“Java 设置”面板。
任何实现 MbInputNodeInterface 且包含在代理的 LIL 路径中的类都在代理中注册为输入节点。当您实现 MbInputNodeInterface 时,您还需要实现这个类的 run 方法。run 方法表示消息流的开始,包含表达消息的数据并将消息在流中向下传播。当线程根据您指定的线程技术模型变为可用时,代理调用 run 方法。
例如,要声明输入节点类:
package com.ibm.jplugins; import com.ibm.broker.plugin.*; public class BasicInputNode extends MbInputNode implements MbInputNodeInterface { ...
当实例化节点时,将调用用户的节点类的构造函数。这是您创建节点的终端并初始化属性的任何缺省值的地方。
输入节点有许多与它关联的输出终端,但通常没有任何输入终端。当实例化节点时,使用 createOutputTerminal 方法将输出终端添加到节点。例如,要创建带有三个输出终端的节点:
public BasicInputNode() throws MbException { createOutputTerminal ("out"); createOutputTerminal ("failure"); createOutputTerminal ("catch"); setAttribute ("firstParserClassName","myParser"); attributeVariable = "none"; }
输入节点可以使用与任何其他 Java 程序相同的方法从任何类型的外部源接收数据(例如,文件系统、队列或数据库),只要从节点的输出是正确的格式即可。
提供一个输入缓冲区(或位流)以包含输入数据,并将它与消息对象关联起来。使用 MbInputNode 类的 createMessage 方法可以从字节数组中创建消息,然后从此消息生成有效的消息集合。要了解这些方法的详细信息,请参阅 JavaAPI。例如,要从文件读取输入:
当您创建了消息集合,您可以将它传播到节点的终端中的一个。
MbOutputTerminal out = getOutputTerminal("out");out.propagate(newAssembly);
msg.clearMessage();
要清空分配给该消息树的内存,调用最后一个 try/catch 程序段中的 clearMessage() 函数。
代理基础结构处理事务问题(例如,在消息处理完成时,控制任何 WebSphere MQ 或工作的数据库单元的提交)。但是,从用户定义的节点修改的资源不需要处在代理的事务控制之下。
从每个消息流维护的线程的池分配每个消息流线程,且在 run 方法中启动执行。
用户定义的节点使用返回值表明事务是否成功,控制事务是提交还是回滚,并控制线程何时返回到池。代理基础捕获任何未处理的意外情况,并且事务发生回滚。
使用以下适当的返回值确定事务和线程的行为:
public int run( MbMessageAssembly assembly ) throws MbException { byte[] data = getDataWithTimeout(); // user supplied method // returns null if timeout if( data == null ) return TIMEOUT; MbMessage msg = createMessage( data ); msg.finalizeMessage( MbMessage.FINALIZE_VALIDATE ); MbMessageAssembly newAssembly = new MbMessageAssembly( assembly, msg ); dispatchThread(); getOutputTerminal( "out" ).propagate( newAssembly ); return SUCCESS_RETURN; }
您需要声明节点的名称,因为它将由工作台标识。所有节点名称必须以“Node”结尾。您使用下列方法声明此名称:
public static String getNodeName() { return "BasicInputNode"; }
package com.ibm.pluginsamples; public class BasicInputNode extends MbInputNode implements MbInputNodeInterface { ...
您使用与 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); }
输入节点实现通常确定什么消息解析器在开始的时候解析输入消息。例如,原语 MQInput 节点规定需要 MQMD 解析器解析 MQMD 头。用户定义的输入节点可以通过使用缺省包含的下列属性(您可以覆盖它们)选择合适的头或消息解析器: