2013-06-04 49 views
4

我試圖將WSO2配置爲使用來自ActiveMQ的消息,並且在處理過程中出現錯誤時(通常是對遠程Web服務的調用失敗時)重新進行請求。WSO2中的JMS消費者事務

<proxy name="SimpleStockQuoteService" transports="jms" startOnLoad="true"> 
    <target> 
    <inSequence onError="JSMErrorHandling"> 
     <log level="full"/> 
     <send> 
      <endpoint> 
       <address uri="http://localhost/testapp"/> 
      </endpoint> 
     </send> 
     <log level="full"/> 
     <log level="custom"> 
      <property name="Custom log" value="End In Sequence"/> 
     </log> 
    </inSequence> 
    <outSequence> 
     ... 
    </outSequence> 
    </target> 
</proxy> 
<sequence name="JSMErrorHandling"> 
    <log level="custom"> 
    <property name="Error" value="Error executing sequence"/> 
    </log> 
    <property name="SET_ROLLBACK_ONLY" value="true" scope="axis2"/> 
    <drop/> 
</sequence> 

ActiveMQ是在axis2.xml配置成與屬性transport.jms.SessionTransacted設置爲true。

當遠程URL的格式無效(例如使用錯誤的協議)時,JMS回滾/重新傳送/ [重定向到死信]功能將按預期工作。 但是,如果我停止遠程Web服務器或使用invlaid服務器名稱,則不會重新發送消息,儘管錯誤由JMSErrorHandling序列處理。

下面是從日誌

[2013-06-04 12:17:47,810] INFO - LogMediator To: , WSAction: urn:mediate, SOAPAction: urn:mediate, MessageID: ID:GCHESNEL764-57101-1370344525419-9:1:1:1:1, Direction: request, Envelope: <?xml ver 
[2013-06-04 12:17:47,813] INFO - LogMediator To: , WSAction: urn:mediate, SOAPAction: urn:mediate, MessageID: ID:GCHESNEL764-57101-1370344525419-9:1:1:1:1, Direction: request, Envelope: <?xml ver 
[2013-06-04 12:17:47,814] INFO - LogMediator Custom log = End In Sequence 
[2013-06-04 12:17:48,818] WARN - ConnectCallback Connection refused or failed for : localhost/127.0.0.1:80 
[2013-06-04 12:17:48,821] WARN - EndpointContext Endpoint : endpoint_413907dd1d4e2370ea0ae277fbfebcaf6504f196a11459bb will be marked SUSPENDED as it failed 
[2013-06-04 12:17:48,823] WARN - EndpointContext Suspending endpoint : endpoint_413907dd1d4e2370ea0ae277fbfebcaf6504f196a11459bb - current suspend duration is : 30000ms - Next retry after : Tue J 
[2013-06-04 12:17:48,824] INFO - LogMediator Error = Error executing sequence 

它看起來像WSO2正在HTTP調用和異步請求之前,是失敗的JMS事務被提交一個摘錄。這種行爲可以配置嗎?

如果需要進一步處理 - 即鏈接遠程服務調用 - 如何確保JMS事務在out序列中保持打開狀態,以便在後期發生錯誤時可以回滾它?

最後,如果WSO2服務在處理過程中被關閉,則不會重新發送消息。有沒有在這裏提出的配置的替代方法:http://docs.wso2.org/wiki/display/ESB460/JMS+FAQ#JMSFAQ-Howtopreventmessagelossduetounavailabilityofadatasource

紀堯姆

回答

-1

使用Messagestore並且已經在WSO2 ESB實現可以使用存儲和處理TECHNIC實現給定的情景MessageProcessor的!進一步的信息可以在保證遞送物品中找到[1],EIP文章DCL [2],消息轉發procssor [3]

[1] http://wso2.com/library/articles/2014/01/guaranteed-delivery-with-Message-Store-Message-Processor%20/

[2] http://docs.wso2.org/display/IntegrationPatterns/Dead+Letter+Channel

[3 ] http://docs.wso2.org/display/ESB481/Sample+702%3A+Introduction+to+Message+Forwarding+Processor

+0

這不回答這個問題,它只是一個推WSO2 EIP模式。 – SKYWALKR

0

我剛碰到同樣的問題。問題是發送中介是非阻塞的。將以下屬性添加到您的序列中,使其成爲阻塞呼叫,從而允許會話在失敗後回滾。

<property name="ClientApiNonBlocking" action="remove" scope="axis2"/>