所以下面我有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之后中断/停止线程-seconds,但我不确定要实现/扩展的接口/类,以及随后连接到我的Spring bean。
答案 0 :(得分:1)
默认情况下,Camel activemq请求在20秒后超时。
对于发送超时,org.apache.activemq.ActiveMQConnectionFactory上有一个sendTimeout属性。 另请检查JMSConfiguraiton的requesttimeout选项。
对于故障转移,您可以在代理URL中设置故障转移传输。
答案 1 :(得分:1)
只需在brokerURL上设置timeout
属性
failover:(tcp\://localhost\:61616)?timeout=25000
这会将错误传播回您的制作人,这样您就可以处理它而不是让它永远阻止该线程......