2010-08-16 227 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月