【发布时间】:2018-11-11 20:56:39
【问题描述】:
使用 wso2 esb 4.9.0,我希望有一个 HTTP api 在 JMS 队列 (activemq) 中推送消息。 jms 发送应该使用故障转移,但是如果没有可用的 activemq 代理,它应该在超时(例如 15 秒)后执行 faultsequence(在 faultsequence 中,应该向原始客户端发送一个带有 http 错误的 http 响应代码 500 和 JSON 正文)
我尝试为我的 activemq 连接工厂使用以下 url:
<parameter name="java.naming.provider.url" locked="false">failover:(tcp://localhost:61616)?timeout=3000</parameter>
我还尝试在我的 api.xml 的 uri 中设置超时参数(省略其他参数):
<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 实现这一点?
有关超时参数的文档,请参阅 activemq 故障转移传输参考:http://activemq.apache.org/failover-transport-reference.html
注意事项
在故障转移传输下,默认情况下,当代理不可用时,发送操作将无限期阻塞。有两个选项可用于处理这种情况。首先,直接在 ActiveMQConnectionFactory 上设置一个 TransportListener,以便它在任何可能需要网络跃点的请求之前就位,或者第二,设置超时选项。 timeout 选项会导致当前发送操作在指定的超时后失败。
例子:
故障转移:(tcp://primary:61616)?timeout=3000
在此示例中,如果未建立连接,则发送操作将在 3 秒后超时。需要注意的是,发生超时时连接不会被终止。因此,一旦代理可用,就可以稍后使用相同的连接重新发送受影响的消息。
【问题讨论】:
标签: wso2 timeout jms esb producer