2013-03-08 97 views
5

所以下面我有駱駝(通過Spring DSL)成功整合我的豆子和ActiveMQ隊列:在駱駝路由的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()) - 之間的駱駝和ActiveMQ的 - 的25秒。因此,當Camel嘗試向/從ActiveMQ發送消息時,如果ActiveMQ花費超過25秒來完成該響應,我希望該線程正常退出。顯然,如果可以設置某種故障轉移(以便可以在將來重新發送超時的請求),這比僅僅丟失消息更受歡迎!

我該如何做到這一點?提前致謝!

更新:如果駱駝/ JMS/ActiveMQ的不支持此開箱,我不介意寫我自己的「ThreadManager」,它中斷25秒後/停止線程,但我不確定實現/擴展什麼接口/類,然後連接到我的Spring bean。

+0

或許,如果我在我的'PooledConnectionFactory'上設置了'expiryTimeout'? – IAmYourFaja 2013-03-08 21:22:04

回答

1

默認情況下,Camel activemq請求在20秒後超時。

對於發送超時,org.apache.activemq.ActiveMQConnectionFactory上有一個sendTimeout屬性。 另請檢查JMSConfiguraiton的requesttimeout選項。

對於故障轉移,您可以在代理網址中設置故障轉移傳輸。

+0

Thanks @ user-soma(+1) - 20秒的ActiveMQ超時的名稱是什麼?這個超時和你提到的「發送超時」有什麼區別?再次感謝! – IAmYourFaja 2013-03-09 15:39:55

+0

@DirtyMikeAndTheBoys - 我的理解是駱駝jms請求超時和ActiveMQConnectionFactory sendtimeout服務於相同的目的,即通知生產者超時。消息到期表示消息的時間相關性。這給經紀人提示不要將過期的消息發送給消費者。 jms配置上的timeToLive指示了這一點。 – techuser 2013-03-13 03:39:13

1

只需設置timeout財產上的brokerURL

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

這將傳播錯誤返回到您的製片人,所以你可以處理它而不是它只是阻塞線程,直到永遠......