2013-03-08 32 views
1

我試圖從ActiveMQ隊列中選取消息並將其傳遞給Websphere MQ隊列。如何停止WSO2將ActiveMQ CorrelationID直接傳遞給Websphere MQ

我使用WSO2作爲最終我們將要使用它給我們的所有功能。

問題似乎是WSO2試圖將ActiveMQ MessageId直接傳遞給Websphere MQ作爲Correlation Id - 它的格式不正確。

我試圖刪除TRANSPORT_HEADERS,但我必須做錯了什麼。

我向inSequence添加了一個虛擬屬性JMS_CORRELATION_ID(按照此post),以查看我是否可以驗證此操作,但Websphere MQ似乎無法識別此頭。

足夠高興地將消息從Websphere MQ傳遞到ActiveMQ可以在我創建的另一個代理服務器中正常工作。在這種情況下,Websphere MQ消息標識將傳遞給Active MQ關聯標識。

這是例外

[2013-03-08 12:18:23,414] ERROR - JMSSender Error creating a JMS message from the message context 
com.ibm.msg.client.jms.DetailedJMSException: JMSCMQ1044: String is not a valid hexadecimal number - 'dolguldur-51590-1362693989456-3:4:1:1:4'. 
Either an attempt was made to specify a group ID or correlation ID which starts with the prefix ID but is not followed by a well-formed hexadecimal value, or an attempt was made to receive a message w 
hich contains an MQRFH2 property of type bin.hex that does not have a well-formed hexadecimal value. 
Ensure that a valid hexadecimal value always follows the ID prefix when setting group ID or correlation ID values. Ensure that any MQRFH2 headers generated by non-JMS applications are well-formed. 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
     at com.ibm.msg.client.commonservices.j2se.NLSServices.createException(NLSServices.java:319) 
     at com.ibm.msg.client.commonservices.nls.NLSServices.createException(NLSServices.java:233) 
     at com.ibm.msg.client.wmq.common.internal.WMQUtils.hexToBin(WMQUtils.java:414) 
     at com.ibm.msg.client.wmq.common.internal.WMQUtils.stringToId(WMQUtils.java:496) 
     at com.ibm.msg.client.wmq.common.internal.messages.WMQMessageHeader.setJMSCorrelationID(WMQMessageHeader.java:314) 
     at com.ibm.msg.client.jms.internal.JmsMessageImpl.setJMSCorrelationID(JmsMessageImpl.java:610) 
     at com.ibm.jms.JMSMessage.setJMSCorrelationID(JMSMessage.java:1133) 
     at org.apache.axis2.transport.jms.JMSSender.createJMSMessage(JMSSender.java:428) 
     at org.apache.axis2.transport.jms.JMSSender.sendOverJMS(JMSSender.java:172) 
     at org.apache.axis2.transport.jms.JMSSender.sendMessage(JMSSender.java:154) 
     at org.apache.axis2.transport.base.AbstractTransportSender.invoke(AbstractTransportSender.java:112) 
     at org.apache.axis2.engine.AxisEngine$TransportNonBlockingInvocationWorker.run(AxisEngine.java:626) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
     at java.lang.Thread.run(Thread.java:662) 
[2013-03-08 12:18:23,417] INFO - AxisEngine [MessageContext: logID=a7a3184cd19f3b5ab7a012af40cd7840329dd8fc40d0e9c3] Error creating a JMS message from the message context 

WSO2代理服務配置

<proxy xmlns="http://ws.apache.org/ns/synapse" name="TestService" transports="jms" statistics="disable" trace="disable" startOnLoad="true"> 
    <target> 
     <inSequence> 
     <property name="TRANSPORT_HEADERS" scope="transport" action="remove"/> 
     <property name="OUT_ONLY" value="true"/> 
     <log level="full"/> 
     </inSequence> 
     <endpoint> 
     <address uri="jms:/QUEUE.OUT?transport.jms.ConnectionFactory=ibmMQQueueConnectionFactory"/> 
     </endpoint> 
    </target> 
    <parameter name="transport.jms.ConnectionFactory">activeMQQueueConnectionFactory</parameter> 
    <parameter name="transport.jms.Destination">TESTJMS.IN</parameter> 
    <description></description> 
</proxy> 

axis2.xml傳輸接收機

<transportReceiver name="jms" class="org.apache.axis2.transport.jms.JMSListener"> 
     <parameter name="activeMQQueueConnectionFactory" locked="false"> 
      <parameter name="java.naming.factory.initial" locked="false">org.apache.activemq.jndi.ActiveMQInitialContextFactory</parameter> 
      <parameter name="java.naming.provider.url" locked="false">tcp://localhost:61616</parameter> 
      <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">QueueConnectionFactory</parameter> 
      <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter> 
     </parameter> 

     <parameter name="ibmMQQueueConnectionFactory" locked="false"> 
      <parameter name="java.naming.factory.initial" locked="false">com.sun.jndi.fscontext.RefFSContextFactory</parameter> 
      <parameter name="java.naming.provider.url" locked="false">file:/E:/work/MQ-JNDI-Directory</parameter> 
      <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">ConnectionFactoryTest</parameter> 
      <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter> 
     </parameter> 

    </transportReceiver> 

axis2.xml傳輸發件人

org.apache.activemq.jndi.ActiveMQInitialContextFactory TCP://本地主機:61616 的QueueConnectionFactory 隊列

<parameter name="ibmMQQueueConnectionFactory" locked="false"> 
    <parameter name="java.naming.factory.initial" locked="false">com.sun.jndi.fscontext.RefFSContextFactory</parameter> 
    <parameter name="java.naming.provider.url" locked="false">file:/E:/work/MQ-JNDI-Directory</parameter> 
    <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">ConnectionFactoryTest</parameter> 
    <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter> 
</parameter> 

乾杯, 史蒂夫

11/3更多信息

所以它看起來像當我把一個關聯ID如ActiveMQ消息中的簡單字符串我不會收到錯誤「JMSCMQ1044:字符串不是有效的十六進制數字」。

因此,從活動MQ到Websphere MQ關聯標識的映射是有問題的。

但是,這是我現在得到的錯誤 - 看起來像類org.apache.axis2.transport.jms.JMSUtils試圖設置一個JMS_DESTINATION頭,Websphere MQ不允許這樣做?

我已經通過編寫一個簡單的java客戶端驗證了這一點,並嘗試設置標頭JMS_DESTINATION,我從Websphere MQ中得到相同的錯誤。

我可以讓Websphere MQ處理這些頭文件嗎?或者讓JMSSender以不同的方式發佈消息?或者org.apache.axis2.transport.jms.JMSSender完全不能用於Websphere MQ?

順便說一句,我使用最新的Websphere MQ 7.5。

[2013-03-11 09:33:20,378] DEBUG - JMSMessageReceiver Received new JMS message for service :TestService 
Destination : queue://TESTJMS.IN 
Message ID  : ID:dolguldur-50398-1362951749472-3:2:1:1:24 
Correlation ID : NONE 
ReplyTo  : null 
Redelivery ? : false 
Priority  : 0 
Expiration  : 0 
Timestamp  : 1362958400374 
Message Type : 
Persistent ? : false 
[2013-03-11 09:33:20,380] TRACE - JMSMessageReceiver 
Message : Enter some text here for the message body... 
[2013-03-11 09:33:20,381] INFO - LogMediator To: , WSAction: urn:mediate, SOAPAction: urn:mediate, MessageID: ID:dolguldur-50398-1362951749472-3:2:1:1:24, Direction: request, Envelope: <?xml version= 
'1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><axis2ns5:text xmlns:axis2ns5="http://ws.apache.org/commons/ns/payload">Enter some tex 
t here for the message body...</axis2ns5:text></soapenv:Body></soapenv:Envelope> 
[2013-03-11 09:33:20,388] DEBUG - JMSConnectionFactory Creating a new JMS Session from JMS CF : ibmMQQueueConnectionFactory 
[2013-03-11 09:33:20,392] DEBUG - JMSConnectionFactory Creating a new JMS MessageProducer from JMS CF : ibmMQQueueConnectionFactory 
[2013-03-11 09:33:20,393] ERROR - JMSSender Error creating a JMS message from the message context 
com.ibm.msg.client.jms.DetailedMessageFormatException: JMSCC0050: The property name 'JMS_DESTINATION' is reserved and cannot be set. 
The supplied property name begins with the JMS prefix, but is not one of the supported, settable properties. 
Check the property name and correct errors. 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
     at com.ibm.msg.client.commonservices.j2se.NLSServices.createException(NLSServices.java:319) 
     at com.ibm.msg.client.commonservices.nls.NLSServices.createException(NLSServices.java:233) 
     at com.ibm.msg.client.jms.internal.JmsErrorUtils.createException(JmsErrorUtils.java:109) 
     at com.ibm.msg.client.jms.internal.JmsMessageImpl.checkSettablePropertyName(JmsMessageImpl.java:2125) 
     at com.ibm.msg.client.jms.internal.JmsMessageImpl.setStringProperty(JmsMessageImpl.java:1560) 
     at com.ibm.jms.JMSMessage.setStringProperty(JMSMessage.java:1496) 
     at org.apache.axis2.transport.jms.JMSUtils.setTransportHeaders(JMSUtils.java:278) 
     at org.apache.axis2.transport.jms.JMSSender.createJMSMessage(JMSSender.java:441) 
     at org.apache.axis2.transport.jms.JMSSender.sendOverJMS(JMSSender.java:172) 
     at org.apache.axis2.transport.jms.JMSSender.sendMessage(JMSSender.java:154) 
     at org.apache.axis2.transport.base.AbstractTransportSender.invoke(AbstractTransportSender.java:112) 
     at org.apache.axis2.engine.AxisEngine$TransportNonBlockingInvocationWorker.run(AxisEngine.java:626) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
     at java.lang.Thread.run(Thread.java:662) 
[2013-03-11 09:33:20,399] ERROR - AsyncCallback Error creating a JMS message from the message context 
org.apache.axis2.AxisFault: Error creating a JMS message from the message context 
     at org.apache.axis2.transport.base.AbstractTransportSender.handleException(AbstractTransportSender.java:226) 
     at org.apache.axis2.transport.jms.JMSSender.sendOverJMS(JMSSender.java:174) 
     at org.apache.axis2.transport.jms.JMSSender.sendMessage(JMSSender.java:154) 
     at org.apache.axis2.transport.base.AbstractTransportSender.invoke(AbstractTransportSender.java:112) 
     at org.apache.axis2.engine.AxisEngine$TransportNonBlockingInvocationWorker.run(AxisEngine.java:626) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
     at java.lang.Thread.run(Thread.java:662) 
Caused by: com.ibm.msg.client.jms.DetailedMessageFormatException: JMSCC0050: The property name 'JMS_DESTINATION' is reserved and cannot be set. 
The supplied property name begins with the JMS prefix, but is not one of the supported, settable properties. 
Check the property name and correct errors. 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
     at com.ibm.msg.client.commonservices.j2se.NLSServices.createException(NLSServices.java:319) 
     at com.ibm.msg.client.commonservices.nls.NLSServices.createException(NLSServices.java:233) 
     at com.ibm.msg.client.jms.internal.JmsErrorUtils.createException(JmsErrorUtils.java:109) 
     at com.ibm.msg.client.jms.internal.JmsMessageImpl.checkSettablePropertyName(JmsMessageImpl.java:2125) 
     at com.ibm.msg.client.jms.internal.JmsMessageImpl.setStringProperty(JmsMessageImpl.java:1560) 
     at com.ibm.jms.JMSMessage.setStringProperty(JMSMessage.java:1496) 
     at org.apache.axis2.transport.jms.JMSUtils.setTransportHeaders(JMSUtils.java:278) 
     at org.apache.axis2.transport.jms.JMSSender.createJMSMessage(JMSSender.java:441) 
     at org.apache.axis2.transport.jms.JMSSender.sendOverJMS(JMSSender.java:172) 
     ... 6 more 
+0

感謝您的理解,因此WSO2無法根據您的帖子實際設置MessageID,因此必須設置其他內容。 – Steve666 2013-03-10 21:56:00

回答

1

這是因爲WebSphere MQ支持JMS規範,該規範聲明消息ID總是由傳輸提供程序設置的。請參閱JMS 1.1 specification


3.4.3 JMSMessageID按
的JMSMessageID按首部字段包含唯一標識由提供商發送的每個消息 的值。

當發送消息時,JMSMessageID被忽略。當發送方法 返回時,該字段包含提供者分配的值。

從JMS發送的所有郵件都通過 WebSphere®的MQ分配的唯一消息標識符:


這將WMQ信息中心話題Mapping JMS header fields at send() or publish()它說,在被確認。分配的值在MQPUT調用後返回到MQMD.MessageId 字段中,並返回給JMSMessageID字段的 中的應用程序。 WebSphere MQ messageId是一個24字節的二進制 值,而JMSMessageID是一個字符串。 JMSMessageID爲 ,由二進制messageId值組成,轉換爲48個 十六進制字符序列,前綴爲字符ID :. JMS提供了 的一個提示,可以將其設置爲禁止生成消息 標識符。該提示被忽略,並且在所有情況下唯一的標識符被分配爲 。 send()被覆蓋之前,在JMSMessageId字段中設置的任何值。

您可以緩存消息ID並在它們通過代理時將其關聯,否則可以通過從JMS API中刪除並使用Java本機API發送消息來完成。假設您使用的是WebSphere MQ的現代版本,則JMS消息不再需要RFH2頭文件,而是將JMS屬性作爲本地WMQ消息屬性攜帶。這意味着JMS應用程序可以在大多數情況下閱讀本機WMQ消息,就好像它們是JMS消息一樣,假設應用程序使用現代QMgr和現代版本的JMS類。

如果需要更新,最新的WMQ客戶端和JMS類位於SupportPac MQC75

+0

我看到,當我通過此方法從IBM MQ向ActiveMQ發送消息時 - IBM MQ消息標識被設置爲ActiveMQ相關標識,而ActiveMQ創建它自己的消息標識。 – Steve666 2013-03-10 21:57:41

+0

所以我現在猜測是WSO2正在從活動Mq消息標識填充IBM MQ關聯標識,並且IBM MQ預期關聯標識的格式與消息標識相同。因此,從這裏我需要填充IBm MQ預期的關聯ID或不填充關聯ID。 – Steve666 2013-03-10 21:59:54

+0

關於權利的聲音。然後,您可能需要服務器端應用程序來保留'correlID',以便ActiveMQ端的事物可以找到它。 – 2013-03-10 22:22:10