使用wso2 esb 4.9.0,我希望在JMS队列(activemq)中有一个HTTP api推送消息。 jms send应该使用故障转移,但如果没有activemq代理可用,它应该在超时后执行faultsequence(例如15 secondes)(在故障序列中,http响应应该发送到原始客户端,带有http错误代码500和JSON正文)
我尝试将以下网址用于我的activemq连接工厂:
<parameter name="java.naming.provider.url" locked="false">failover:(tcp://localhost:61616)?timeout=3000</parameter>
我也尝试在api.xml中的uri中设置timeout参数(省略其他参数):
<send>
<endpoint>
<address uri="jms:/MyQueue?java.naming.provider.url=failover:(tcp://localhost:616161)?timeout=3000"/>
</endpoint>
</send>
当我杀死所有activemq经纪人时,我的api仍无限期地阻止:
curl -XPOST -H "Content-Type: application/json" -d '{}' -k "https://localhost:8243/myApi/send"
^C # I have to kill it manually; instead it should return an error
如何使用wso2 esb实现此功能?
有关timeout参数的文档,请参阅activemq failover transport reference:http://activemq.apache.org/failover-transport-reference.html
注释
在故障转移传输下,默认情况下,当代理变为不可用时,发送操作将无限期地阻止。有两种方法可用于处理此方案。首先,直接在ActiveMQConnectionFactory上设置TransportListener,以便在任何可能需要网络跃点或秒的请求之前将其设置到位,设置超时选项。超时选项会导致当前发送操作在指定的超时后失败。
示例:
故障切换:(TCP://主:61616)超时= 3000
?在此示例中,如果未建立连接,则发送操作将在3秒后超时。请务必注意,发生超时时不会终止连接。因此,一旦代理可用,就可以稍后使用相同的连接重新发送受影响的消息。
答案 0 :(得分:0)
尝试使用
在发送调解员之前<property name="ClientApiNonBlocking" action="remove" scope="axis2"/>
。
答案 1 :(得分:0)
在我的情况下,这是一个连接创建,因此设置startupMaxReconnectAttempts = X允许我在多次重新连接尝试后“超时”。使用默认设置(指数退避),约5秒后X = 10超时值。所以我用了
<address uri="jms:/MyQueue?java.naming.provider.url=failover:(tcp://localhost:616161)?startupMaxReconnectAttempts=10"/>