IBM Mq消息头

Ana*_*man 5 head ibm-mq

我正在向远程队列发送消息,我无法控制它.

我发送一个xml文件作为消息,但当应用程序读取消息时,它会获得一个消息标题

<mcd><Msd>jms_text</Msd></mcd>  \0\0\0l<jms><Dst>queue:///TEST</Dst><Tms>1281475843707</Tms><Cid></Cid><Dlv>1</Dlv></jms>
Run Code Online (Sandbox Code Playgroud)

我不希望这个消息头存在,我发送此消息的代码如下:

Properties props = new Properties();
    props.setProperty("java.naming.factory.initial",this.initialFactory);
    props.setProperty("java.naming.provider.url", url);

    Context context = new InitialContext(props);

    QueueConnectionFactory qcf = (QueueConnectionFactory) context.lookup(this.context);
    qConn = qcf.createQueueConnection();
    queue = (Queue)context.lookup(name);
    qSession = qConn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
    qConn.start();
            QueueSender send = qSession.createSender(queue);
     String text = "My xml file";
     TextMessage tm = qSession.createTextMessage(text);
     send.send(tm);
     send.close();
Run Code Online (Sandbox Code Playgroud)

我该如何避免这种情况?

gre*_*ker 9

您似乎正在向非jms目的地发送jms消息.消息如何在目的地上消耗?是否期望本机MQ消息?接收方不了解存储JMS头属性的MQRFH2头.

您应该配置目标以了解jms,或者您可以执行以下操作来告诉mq jms您的接收器是非jms客户端.

((com.ibm.mq.jms.MQQueue) queue).setTargetClient(JMSC.MQJMS_CLIENT_NONJMS_MQ);
Run Code Online (Sandbox Code Playgroud)


T.R*_*Rob 5

查看文档中列出的 JMS对象的属性.在受管对象上有一个名为TARGCLIENT的属性,应该设置为'MQ'.尽管您可能无法控制受管理对象,但管理受管对象的人员有责任正确设置此属性.如果目标不理解RFH2标头(WMQ v6用于保存JMS属性),那么向该目标发送消息的任何WMQ JMS应用程序都必须设置该属性.

顺便提一下,您遇到此问题的事实往往表明应用程序使用消息仍处于v6.请注意,WMQ的v6.0截至2011年9月已停止使用.如果您现在在QMgr和客户端都切换到v7,则可以通过队列本身的简单设置进行管理.遗留应用程序将了解消息,无论他们是否连接了RFH2,客户端应用程序都会将响应视为JMS消息,无论旧应用程序是否添加RFH2标头.现在转到v7,保存自己在开发这个应用程序时遇到很多麻烦,同时避免明年迁移到v7.

WMQ v7客户端下载可在此处获得

更新:WMQ V6的寿命终止已推迟至2012年9月.