【问题标题】:IBM Mq Message HeaderIBM Mq 消息头
【发布时间】:2010-08-16 12:48:01
【问题描述】:

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

我发送一个 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();

如何避免这种情况?

【问题讨论】:

    标签: ibm-mq head


    【解决方案1】:

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

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

    ((com.ibm.mq.jms.MQQueue) queue).setTargetClient(JMSC.MQJMS_CLIENT_NONJMS_MQ);
    

    【讨论】:

    • 嘿,谢谢伙计,它有效,我刚刚尝试了您的修复。现在我必须明白这意味着什么
    • 好吧,既然您在代码中做了一个解决方法,而不是设置托管对象,这意味着任何其他向该目的地发送 JMS 消息的应用程序或模块也会遇到同样的问题。将其设置在受管对象(.bindings 文件、LDAP 或其他)中,无需代码即可在所有使用该受管对象的应用程序中修复它。
    • @T.Rob - 我同意他应该设置受管对象以正确接收 jms 消息,但从他的问题来看,他似乎无法控制端点。
    • @gwhitake 我想知道我们是否在谈论不同的事情。我指的管理对象是 .bindings 文件、LDAP 或由本地 Web 应用程序服务器管理,具体取决于他的应用程序的运行方式。因此,即使他无法控制端点,somebody 也会生成他的应用程序获取的 WMQ 连接工厂托管对象。如果那个人设置了 targclient,那么任何使用该托管对象的代码都可以在不修改的情况下工作。
    • 当然,应用程序甚至可能不使用 JNDI 来获取 CF,在这种情况下,这一切都不适用,代码修改是唯一的答案。但是,如果有一个托管对象,那么就有机会做正确的事情,不仅可以使用 targclient,还可以使用 FAILIFQUIESCE 和六个在运行时重要的其他属性。可扩展策略不是在每个应用程序都必须了解差异、正确编码然后在升级到 v7 后重新编码的代码中执行此操作,而是在跨许多应用程序利用它的托管对象中执行此操作。跨度>
    【解决方案2】:

    查看 JMS 对象 as listed in the docs 的属性。在受管对象上有一个名为 TARGCLIENT 的属性,应设置为“MQ”。尽管您可能无法控制受管对象,但管理受管对象的人有责任正确设置此属性。如果目的地不理解 RFH2 标头(WMQ v6 使用它来保存 JMS 属性),那么任何向该目的地发送消息的 WMQ JMS 应用程序必须设置该属性。

    顺便说一句,您遇到此问题的事实往往表明使用消息的应用程序仍处于 v6。请注意,WMQ 的 v6.0 已于 2011 年 9 月终止。如果您现在在 QMgr 和客户端切换到 v7,您可以通过队列本身的简单设置来管理它。旧版应用程序将理解这些消息,无论它们是否附加了 RFH2,并且客户端应用程序将响应视为 JMS 消息,无论旧版应用程序是否添加 RFH2 标头。立即迁移到 v7,为您自己节省开发此应用程序的大量麻烦,并且避免明年必须迁移到 v7。

    WMQ v7 客户端下载可用here

    更新:WMQ V6 的终止生命周期被推迟到 2012 年 9 月。

    【讨论】:

      猜你喜欢
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      • 2022-07-21
      • 1970-01-01
      • 2012-10-01
      • 2019-08-29
      相关资源
      最近更新 更多