2010-08-16 190 views
5

我正在发送消息到远程队列,我无法控制。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> 

消息头,我不希望这个消息头是现在和我发送此消息代码如下:

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

我该如何避免这种情况?

回答

9

看来您正在向非jms目标发送jms消息。消息如何在目的地上消费?它是否期待本地MQ消息?接收者不理解存储JMS头部属性的MQRFH2头部。

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

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

嘿感谢,会尝试,让你知道 – 2010-08-17 05:05:30

+0

嘿感谢伙计它的工作原理,我只是尝试了你的修复。现在我必须明白它是什么意思 – 2010-08-19 06:33:41

+0

好吧,既然你在代码中做了一个解决方法,而不是设置管理对象,这意味着任何其他的应用程序或模块发送JMS消息到目标也会有同样的问题。将其设置在受管理的对象(.bindings文件,LDAP或其他)中,并且在没有代码的情况下以及使用该受管对象的所有应用程序中修复它。 – 2010-08-20 14:50:21

5

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

顺便说一句,你有这个问题的事实往往表明,消费应用程序消息仍然在v6。请注意,截至2011年9月,WMQ的v6.0版已达到使用寿命。如果您现在在QMgr和客户端都切换到v7,则可以使用队列本身的简单设置来管理此版本。无论传统应用程序是否添加了RFH2标头,传统应用程序都会理解这些消息,无论它们是否附加了RFH2,客户端应用程序都会将响应看作JMS消息。现在转到v7,为自己节省很多开发此应用程序的麻烦,并且避免在明年迁移到v7。

WMQ V7客户端下载,请here

更新:对于WMQ V6报废,被推迟到2012年9月