2013-03-08 14 views
5

così in basso Ho Camel (via Primavera DSL) che integra con successo i miei fagioli con le code ActiveMQ:Attiva il timeout del socket su ActiveMQ dal percorso Camel?

<!-- 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> 

mi piacerebbe far rispettare in modo esplicito un timeout presa (su Socket.read()) - tra il cammello e ActiveMQ - di 25 secondi. Pertanto, quando Camel tenta di instradare un messaggio a/da ActiveMQ, se ActiveMQ impiega più di 25 secondi per completare la risposta, voglio che il thread esca con garbo. Ovviamente, se è possibile impostare anche qualche tipo di failover (in modo che richieda che il timeout possa essere riprodotto in un momento futuro) è molto preferibile rispetto alla perdita del messaggio!

Come posso realizzare questo? Grazie in anticipo!

Aggiornamento: se Camel/JMS/ActiveMQ non supporta questa out of the box, non mi dispiace scrivere il mio "ThreadManager" che interrompe/arresta le discussioni dopo 25 secondi, ma non sono sicuro quali interfacce/classi implementare/estendere e successivamente collegare i miei bean Spring.

+0

Forse, se Ho impostato un 'expiryTimeout' sul mio' PooledConnectionFactory'? – IAmYourFaja

risposta

1

Per impostazione predefinita, la richiesta di attivazione di Camel timeout scade dopo 20 secondi.

Per i timeout di invio è disponibile una proprietà sendTimeout su org.apache.activemq.ActiveMQConnectionFactory. Controllare anche l'opzione requesttimeout per JMSConfiguraiton.

Per il failover è possibile impostare il trasporto di failover nell'URL del broker.

+0

Grazie @ user-soma (+1) - qual è il nome del timeout ActiveMQ di 20 secondi? E qual è la differenza tra questo timeout e il "timeout di invio" che hai menzionato? Grazie ancora! – IAmYourFaja

+0

@DirtyMikeAndTheBoys - La mia comprensione è che timeout richiesta jm cammello e ActiveMQConnectionFactory sendtimeout hanno lo stesso scopo, ad es., Per informare il produttore del timeout. La scadenza del messaggio indica la pertinenza temporale di un messaggio. Questo dà un suggerimento al broker di non inviare messaggi scaduti al consumatore. timeToLive su jmsconfiguration indica questo. – techuser

1

basta impostare la proprietà timeout sul brokerURL

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

questo si propaga un errore di nuovo al vostro produttore in modo da poter gestire la cosa invece di avere solo bloccare il thread per sempre ...

Problemi correlati