5

我正在向我无法控制的远程队列发送消息。

我将 xml 文件作为消息发送,但是当应用程序读取消息时,它会得到一个消息头,例如

<mcd><Msd>jms_text</Msd></mcd>  \0\0\0l<jms><Dst>queue:///TEST</Dst><Tms>1281475843707</Tms><Cid></Cid><Dlv>1</Dlv></jms>

我不希望出现此消息标头,并且我发送此消息的代码如下:

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();

我该如何避免这种情况?

4

2 回答 2

9

您似乎正在向非 jms 目的地发送 jms 消息。消息在目的地是如何被消费的?是否期待原生 MQ 消息?接收方不理解存储 JMS 标头属性的 MQRFH2 标头。

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

((com.ibm.mq.jms.MQQueue) queue).setTargetClient(JMSC.MQJMS_CLIENT_NONJMS_MQ);
于 2010-08-16T13:55:49.487 回答
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 月。

于 2010-08-16T18:22:53.650 回答