我正在尝试将WSO2配置为使用来自ActiveMQ的消息,并在处理期间引发错误时重新排队 - 通常是在对远程Web服务的调用失败时。
<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>
在axis2.xml中配置Activemq,并将属性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事务按顺序保持打开状态,以便在后期发生错误时可以回滚?
最后,如果在处理期间关闭WSO2服务,则不会将消息重新排队。是否有替代此处提议的配置:http://docs.wso2.org/wiki/display/ESB460/JMS+FAQ#JMSFAQ-Howtopreventmessagelossduetounavailabilityofadatasource
纪尧姆
答案 0 :(得分:0)
使用已在wso2 ESB中实现的Messagestore和MessageProcessor您可以使用Store和process Technic实现给定的方案!更多信息可以在保证交付文章[1],DCL的EIP文章[2],消息转发procssor [3]
中找到。[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
答案 1 :(得分:0)
我刚遇到同样的问题。问题是send mediator是非阻塞的。将以下属性添加到您的序列中以使其成为阻塞调用,从而允许会话在失败后回滚。
<property name="ClientApiNonBlocking" action="remove" scope="axis2"/>