【问题标题】:Enforce socket timeout on ActiveMQ from Camel route?从 Camel 路由强制 ActiveMQ 上的套接字超时?
【发布时间】:2013-02-24 12:03:28
【问题描述】:

所以下面我有 Camel(通过 Spring DSL)成功地将我的 bean 与 ActiveMQ 队列集成:

<!-- Note: this code is just a snippet; if you need to see more, please let me know! -->
<camelContext id="my-camel-context" xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="activemq-myinstance:queue:myqueue" />
        <onException>
            <exception>java.lang.Exception</exception>
            <redeliveryPolicy maximumRedeliveries="2" />
            <to uri="activemq-myinstance:queue_failures" />
        </onException>
        <to uri="bean:myBean?method=doCommand" />           
    </route>
</camelContext>

<bean id="jmsConnectionFactory-myqueue" class="org.apache.activemq.ActiveMQConnectionFactory">
    <property name="brokerURL" value="${activemq.instance.url}" />
</bean>

<bean id="pooledConnectionFactory-myqueue" class="org.apache.activemq.pool.PooledConnectionFactory">
    <property name="maxConnections" value="64" />
    <property name="maximumActive" value="${max.active.consumers}" />
    <property name="connectionFactory" ref="jmsConnectionFactory-myqueue" />
</bean>

<bean id="jmsConfig-myqueue" class="org.apache.camel.component.jms.JmsConfiguration">
    <property name="connectionFactory" ref="pooledConnectionFactory-myqueue"/>
    <property name="concurrentConsumers" value="${max.active.consumers}"/>
</bean>

<bean id="activemq-myqueue" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="configuration" ref="jmsConfig-myqueue"/> 
</bean>

我想明确强制执行 套接字超时(在 Socket.read() 上) - 在 Camel 和 ActiveMQ 之间 - 为 25 秒。因此,当 Camel 尝试将消息路由到 ActiveMQ 或从 ActiveMQ 路由消息时,如果 ActiveMQ 需要超过 25 秒才能完成该响应,我希望线程优雅地退出。显然,如果还可以设置某种故障转移(以便超时的请求可以在未来重播),这比仅仅丢失消息更可取!

我怎样才能做到这一点?提前致谢!

更新:如果 Camel/JMS/ActiveMQ 不支持开箱即用,我不介意编写自己的“ThreadManager”,它会在 25 秒后中断/停止线程,但我不确定要实现/扩展哪些接口/类,然后连接到我的 Spring bean。

【问题讨论】:

  • 也许如果我在我的PooledConnectionFactory 上设置一个expiryTimeout

标签: java sockets timeout activemq apache-camel


【解决方案1】:

默认情况下,Camel activemq 请求在 20 秒后超时。

对于发送超时,org.apache.activemq.ActiveMQConnectionFactory 上有一个 sendTimeout 属性。 还要检查 JMSConfiguraiton 的 requesttimeout 选项。

对于故障转移,您可以在代理 url 中设置故障转移传输。

【讨论】:

  • 感谢@user-soma (+1) - 20 秒 ActiveMQ 超时的名称是什么?这个超时和你提到的“发送超时”有什么区别?再次感谢!
  • @DirtyMikeAndTheBoys - 我的理解是骆驼 jms 请求超时和 ActiveMQConnectionFactory sendtimeout 有相同的目的,即通知生产者超时。消息到期指示消息的时间相关性。这会提示代理不要向消费者发送过期消息。 jmsconfiguration 上的 timeToLive 表明了这一点。
【解决方案2】:

只需在您的 brokerURL 上设置 timeout 属性

failover:(tcp\://localhost\:61616)?timeout=25000

这会将错误传播回您的生产者,以便您可以处理它而不是让它永远阻塞线程......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多