2013-06-04 61 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"/>