【问题标题】:WSO2 esb as a jms producer with failover transport timeoutWSO2 esb 作为具有故障转移传输超时的 jms 生产者
【发布时间】: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


    【解决方案1】:

    尝试使用 &lt;property name="ClientApiNonBlocking" action="remove" scope="axis2"/&gt; 在发送中介之前。

    【讨论】:

    • 为什么会这样?它需要超时参数吗?在哪里?
    【解决方案2】:

    在我的情况下,这是一个连接创建,因此设置 startupMaxReconnectAttempts=X 允许我在多次重新连接尝试后“超时”。使用默认设置(指数退避),X=10 的值在大约 5 秒后超时。所以我用了

    <address uri="jms:/MyQueue?java.naming.provider.url=failover:(tcp://localhost:616161)?startupMaxReconnectAttempts=10"/>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      • 2012-04-22
      相关资源
      最近更新 更多