2013-08-27 87 views
0

我使用WSO2 ESB 4.7.0和ActiveMQ。我試圖按照this wso2文檔實現簡單的存儲和轉發配置。WSO2 ESB 4.7.0 JMS MessageStore/MessateProcessor無法處理JSON正確

這裏是我使用JMS和轉發到存儲代理:

<?xml version="1.0" encoding="UTF-8"?> 
<proxy xmlns="http://ws.apache.org/ns/synapse" 
     name="testJMSStorenFwd" 
     transports="http" 
     startOnLoad="true" 
     trace="disable"> 
    <description/> 
    <target> 
     <inSequence onError="fault"> 
     <property name="messageType" value="application/json" scope="axis2"/> 
     <property name="FORCE_ERROR_ON_SOAP_FAULT" value="true"/> 
     <property name="OUT_ONLY" value="true"/> 
     <log level="full"/> 
     <property name="target.endpoint" value="JMSRcvEndPoint" format="soap11"/> 
     <store messageStore="FMSReadings"/> 
     <!--send> 
      <endpoint key="JMSRcvEndPoint" format="soap11"/> 
     </send--> 
     <property name="FORCE_SC_ACCEPTED" value="true" scope="axis2"/> 
     </inSequence> 
     <outSequence> 
     <send/> 
     </outSequence> 
    </target> 
</proxy> 

下面是該消息應最終被轉發端點:

<?xml version="1.0" encoding="UTF-8"?> 
<endpoint xmlns="http://ws.apache.org/ns/synapse" name="JMSRcvEndPoint"> 
    <address uri="http://kk1:8282/services/testJMSRcvProxy" format="soap11"/> 
</endpoint> 

這裏是代理其接收轉發消息(它只是記錄所接收的消息爲這個測試):

<?xml version="1.0" encoding="UTF-8"?> 
<proxy xmlns="http://ws.apache.org/ns/synapse" 
     name="testJMSRcvProxy" 
     transports="http" 
     startOnLoad="true" 
     trace="disable"> 
    <description/> 
    <target> 
     <inSequence onError="fault"> 
     <property name="messageType" value="application/json" scope="axis2"/> 
     <property name="FORCE_ERROR_ON_SOAP_FAULT" value="true"/> 
     <log level="full"/> 
     <drop/> 
     </inSequence> 
     <outSequence> 
     <drop/> 
     </outSequence> 
    </target> 
</proxy> 

這是我messagestore:

<?xml version="1.0" encoding="UTF-8"?> 
<messageStore xmlns="http://ws.apache.org/ns/synapse" 
       class="org.wso2.carbon.message.store.persistence.jms.JMSMessageStore" 
       name="FMSReadings"> 
    <parameter name="java.naming.factory.initial">org.apache.activemq.jndi.ActiveMQInitialContextFactory</parameter> 
    <parameter name="store.jms.cache.connection">false</parameter> 
    <parameter name="java.naming.provider.url">tcp://localhost:61616</parameter> 
    <parameter name="store.jms.JMSSpecVersion">1.1</parameter> 
</messageStore> 

這裏是我的MessageProcessor的:

<?xml version="1.0" encoding="UTF-8"?> 
<messageProcessor xmlns="http://ws.apache.org/ns/synapse" 
        class="org.apache.synapse.message.processors.forward.ScheduledMessageForwardingProcessor" 
        name="fwdTotestJMSRcvProxy" 
        messageStore="FMSReadings"> 
    <parameter name="interval">1000</parameter> 
</messageProcessor> 

我使用非常基本的JSON簡單的curl命令來測試此設置如下圖所示:

curl -v -H "Accept: application/json" -H "Content-Type:application/json" -d '{"mail":"[email protected]"}' http://kk1:8282/services/testJMSStorenFwd 

當我運行此消息被存儲並轉發的設置(我可以從ActiveMQ的Web UI的驗證消息被排隊和出隊),但我得到以下錯誤在ESB日誌:

[2013-08-27 14:24:44,052] INFO - To: /services/testJMSStorenFwd, MessageID: urn:uuid:bb553e52-ee61-4d15-8c1f-19be1356c8e0, Direction: request, Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body><mail>[email protected]</mail></soapenv:Body></soapenv:Envelope> {org.apache.synapse.mediators.builtin.LogMediator} 
[2013-08-27 14:24:44,085] ERROR - Error building message {org.apache.synapse.transport.passthru.util.DeferredMessageBuilder} 
org.apache.axis2.AxisFault: Failed to convert JSON to XML payload. Expected a ',' or '}' at character 50 of { "xmlPayload" : <mail>[email protected]</mail>} 
    at org.apache.axis2.json.JSONBuilder.processDocument(JSONBuilder.java:86) 
    at org.apache.synapse.transport.passthru.util.DeferredMessageBuilder.getDocument(DeferredMessageBuilder.java:118) 

如果您在上面的testJMSStorenFwd代理中注意到我已註釋掉髮送部分。如果我取消註釋並註釋掉

<property name="target.endpoint" value="JMSRcvEndPoint" format="soap11"/> 
     <store messageStore="FMSReadings"/> 

節,我得到的JSON正確地轉換爲XML和下面的輸出日誌中:

[2013-08-27 14:53:27,333] INFO - To: /services/testJMSStorenFwd, MessageID: urn:uuid:e482aba1-98a9-4181-9c8e-c5110dcefd09, Direction: request, Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body><mail>[email protected]</mail></soapenv:Body></soapenv:Envelope> {org.apache.synapse.mediators.builtin.LogMediator} 
[2013-08-27 14:53:27,346] INFO - To: /services/testJMSRcvProxy, MessageID: urn:uuid:e6da7131-60ec-4c92-b204-e3843f7e6e91, Direction: request, Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><soapenv:Envelope><soapenv:Body><mail>[email protected]</mail></soapenv:Body></soapenv:Envelope></soapenv:Body></soapenv:Envelope> {org.apache.synapse.mediators.builtin.LogMediator} 

正如你可以從上面看到,在相同的輸入到messagestore &使用相同設置的messageprocessor機制會導致JSON到XML轉換錯誤。

這是一個wso2 esb MessageStore中的錯誤& /或MessageProcessor或者我做錯了什麼? 有擺脫我,而使用這個JMS存儲轉發&無需訴諸腳本中介獲得錯誤的方法嗎?

回答

0

好像你正在試圖實現對REST SOAP場景。 http://docs.wso2.org/display/ESB470/Using+REST+with+a+Proxy+Service#UsingRESTwithaProxyService-RESTClientandSOAPService

嘗試刪除您代理messageType財產。

+0

是的,我已經通過移除MessageType屬性嘗試過。它仍然給出了完全相同的錯誤。 你讀過整個問題了嗎?該錯誤僅在使用JMS消息存儲和消息處理器時發生。如果我使用簡單的發送中介並傳遞給接收方代理(在兩種情況下都是相同的),我不會收到該錯誤。這使我相信Messagestore&Messageprocessor執行JSON到XML轉換的方式與其他中介方式有所不同。因此,問題是否存在錯誤或者我應該如何處理這個問題? – kmkale