MB与MQ操作相关

本文档详细介绍了如何在IBM WebSphere Message Broker中使用JavaCompute节点进行消息处理,包括创建新消息、复制消息头、创建和访问XML元素、更新Local和Global Environment,以及传播消息到不同终端。示例代码展示了如何操作消息树,如添加XML元素、复制MQMD和MQRFH2头等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JavaCompute 节点创建新消息

 

调用 MbMessage 的缺省构造函数以创建空白消息

MbMessage outMessage = new MbMessage();

从入局消息复制这些头

copyMessageHeaders(inMessage, outMessage);

 

创建新的消息体

首先,添加顶级解析器元素

对于 XML

MbElement outRoot = outMessage.getRootElement();
   
MbElement outBody = outRoot.createElementAsLastChild("XMLNSC");
   

然后,可以使用 createElement 方法和代理 XPath 实现的扩展语法构建该消息的其余部分。

 

 

 

 

文档与java操作。

<document>

  <chapter title='Introduction'>

    某些文本。

  </chapter>

</document>

 

 

示例程序。

import com.ibm.broker.javacompute.MbJavaComputeNode;

import com.ibm.broker.plugin.*;

public class pub_sub_flow_JavaCompute extends MbJavaComputeNode {

 

       public void evaluate(MbMessageAssembly inAssembly) throws MbException {

              MbOutputTerminal out = getOutputTerminal("out");

              MbOutputTerminal alt = getOutputTerminal("alternate");

 

              MbMessage inMessage = inAssembly.getMessage();

 

              // create new message

              MbMessage outMessage = new MbMessage(inMessage);

              MbMessageAssembly outAssembly = new MbMessageAssembly(inAssembly,

                            outMessage);

 

              try {

                     // ----------------------------------------------------------

                    

                     /**

                     <document>

                       <chapter title='Introduction'>

                         某些文本。

                       </chapter>

                     </document>

                     */

                     // get the chapter

                     MbElement root = inAssembly.getMessage().getRootElement();

 

                     MbElement chapter = root.getLastChild().getFirstChild().getFirstChild();

                    

                     // Add user code below

                    

                     // get the LocalEnvironment.

                     inAssembly.getLocalEnvironment();

                    

                     // get the GlobalEnvironment.

                     inAssembly.getGlobalEnvironment();

                    

                     // get the message from the MbMessageAssembly.;

                     // first too check the MbMessageAssembly.

                     MbMessage msg = inAssembly.getMessage();

                    

                     // get the root. it is the root.

                     MbElement eleroot = msg.getRootElement();

                    

                     // get the attribute. it is the first child;

                     MbElement eleatt  = eleroot.getFirstChild();

                    

                     // get the MQMD.

                     MbElement elemqmd = eleroot.getNextSibling();

                    

                     // get the xml. it is the message.

                     MbElement msgbody = eleroot.getLastChild();

                     msgbody = elemqmd.getNextSibling();

 

                     // End of user code

                     // ----------------------------------------------------------

 

                     // The following should only be changed

                     // if not propagating message to the 'out' terminal

                     System.out.println("AAAAAA");

                     out.propagate(outAssembly);

 

              } finally {

                     // clear the outMessage

                     outMessage.clearMessage();

              }

       }

}

 

 

 

 

JavaCompute 节点复制消息

 

MbMessage outMessage = new MbMessage(inAssembly.getMessage);

 MbMessageAssembly outAssembly = new MbMessageAssembly(inAssembly, outMessage);

 

 

JavaCompute 节点创建新元素

 

使用 JavaCompute 节点中的以下方法可在消息树中创建新元素:

  • createElementAsFirstChild()
  • createElementAsLastChild()
  • createElementBefore()
  • createElementAfter()

该方法返回对新建元素的引用。每个方法都有三个重载形式:

createElement...(int type)

创建指定类型的空白元素。有效的一般类型是:

·   MbElement.TYPE_NAME。这种类型的元素只有名称,例如,XML 元素。

·   MbElement.TYPE_VALUE。这种类型的元素只有值,例如,未包含在 XML 元素中的 XML 文本。

·   MbElement.TYPE_NAME_VALUE。这种类型的元素既有名称,也有值,例如,XML 属性。

也可以分配特定的类型值。这类信息的含义取决于解析器。元素名称和值信息必须使用 setName() setValue() 方法进行指定。

createElement...(int type, String name, Object value)

用于在创建时设置元素值和元素名称的方法。

createElement...(String parserName)

createElement...() 的特殊形式,仅用于创建顶级解析器元素。

以下 Java 代码示例向 JavaCompute 节点访问消息树中的元素中给出的 XML 示例添加新的 chapter 元素:

MbElement root = outMessage.getRootElement();

MbElement document = root.getLastChild().getFirstChild();

MbElement chapter2 = document.createElementAsLastChild(MbElement.TYPE_NAME,"Chapter",null);

 

// add title attribute

MbElement title2 = chapter2.createElementAsFirstChild(MbElement.TYPE_NAME_VALUE,

"title", "Message Flows");

这段代码生成以下 XML 输出:

<document>

<chapter title="Introduction">

某些文本。

 

  </chapter>

<chapter title="Message Flows"/>

</document>

 

 

JavaCompute 节点访问消息头

 JavaCompute 节点复制消息头

public void copyMessageHeaders(MbMessage inMessage, MbMessage outMessage) throws MbException
   
{
   
MbElement outRoot = outMessage.getRootElement();
   
MbElement header = inMessage.getRootElement().getFirstChild();
   

  
    
  
while(header != null && header.getNextSibling() != null)
   
        {
   
outRoot.addAsLastChild(header.copy());
   
header = header.getNextSibling();
   
        }
   
}
   

 JavaCompute 节点访问 MQMD

public void addMqmd(MbMessage msg) throws MbException
   
{
   
MbElement root = msg.getRootElement();
   

  
    
  
// create a top level 'parser' element with parser class name
   
MbElement mqmd = root.createElementAsFirstChild("MQHMD");
   

  
    
  
// specify next parser in chain
   
mqmd.createElementAsFirstChild(MbElement.TYPE_NAME_VALUE,
   
"Format",
   
"XMLNS");
   
}
   

 

 JavaCompute 节点访问 MQRFH2

public void addRfh2(MbMessage msg) throws MbException
   
{
   
MbElement root = msg.getRootElement();
   
MbElement body = root.getLastChild();
   

  
    
  
// insert new header before the message body
   
MbElement rfh2 = body.createElementBefore("MQHRF2");
   

  
    
  
rfh2.createElementAsFirstChild(MbElement.TYPE_NAME_VALUE, "Version", new Integer(2));
   
rfh2.createElementAsFirstChild(MbElement.TYPE_NAME_VALUE, "Format", "MQSTR");
   
rfh2.createElementAsFirstChild(MbElement.TYPE_NAME_VALUE, "NameValueCCSID", new Integer(1208));
   

  
    
  
MbElement psc = rfh2.createElementAsFirstChild(MbElement.TYPE_NAME, "psc", null);
   
psc.createElementAsFirstChild(MbElement.TYPE_NAME, "Command", "RegSub");
   
psc.createElementAsFirstChild(MbElement.TYPE_NAME, "Topic", "department");
   
psc.createElementAsFirstChild(MbElement.TYPE_NAME, "QMgrName", "QM1");
   
psc.createElementAsFirstChild(MbElement.TYPE_NAME, "QName", "PUBOUT");
   
psc.createElementAsFirstChild(MbElement.TYPE_NAME, "RegOpt", "PersAsPub");
   

  
    
  
        MbXPath xp [equals char] new MbXPath("/MQMD/Format" + "[set-value(´MQHRF2´)]", root);
   
        root.evaluateXPath(xp);
   
}
   

 

 

JavaCompute 节点更新 Local Environment

创建本地环境的新副本,以更新它。使用副本构造函数的完全版本创建新的 MbMessageAssembly 对象,如下例所示:

1.                             MbMessage env = assembly.getLocalEnvironment();
   
2.                             MbMessage newEnv = new MbMessage(env);
   
3.                             
   
     
   
4.                             newEnv.getRootElement().createElementAsFirstChild(
   
5.                                            MbElement.TYPE_NAME_VALUE,
   
6.                             "Status",
   
7.                             "Success");
   
8.                             
   
     
   
9.                             MbMessageAssembly outAssembly = new MbMessageAssembly(
   
10.                                        assembly,
   
11.                                        newEnv,
   
12.                         assembly.getGlobalEnvironment(),
   
13.                         assembly.getExceptionList(),
   
14.                         assembly.getMessage());
   
15.                         
   
     
   
16.                         getOutputTerminal("out").propagate(outAssembly);
   

编辑该副本以更新本地环境。

 

JavaCompute 节点更新 Global Environment

Global Environment 跨消息流更改,因此不必创建用于更改的副本。以下 Java 代码显示了如何更改 Global Environment

MbMessage env = assembly.getGlobalEnvironment();

env.getRootElement().createElementAsFirstChild(MbElement.TYPE_NAME_VALUE, "Status", "Success");

 

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

 

 

将消息传播到 JavaCompute 节点 Out Alternate 终端上

JavaCompute 节点有两个输出终端:Out Alternate。因此,您可以将该节点用作 filter 节点和消息转换节点。处理消息后,可使用 propagate() 方法将该消息传播到输出终端上。要将消息套件传播到 Out 终端上,请使用以下方法:

out.propagate(assembly);

要将消息套件传播到 Alternate 终端上,请使用以下方法:

alt.propagate(assembly);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

内置节点

WebSphere Message Broker 提供了内置节点,您可以使用它们来定义您的消息流。要获取有关这些节点中的每个节点的信息,请参考下面相应的链接。此处列出的节点根据其功能进行分组。

输入和输出

消息处理和转换

整理请求

作出决定

子流标识

错误处理和报告

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值