2013-03-08 16 views
5

Więc poniżej mam Camel (przez DSL) Wiosna powodzeniem integrujący moje fasoli z kolejek ActiveMQ:Wymuś przekroczenie limitu czasu na ActiveMQ z trasy 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> 

Chciałbym wyraźnie egzekwować timeout gniazdo (na Socket.read()) - pomiędzy Camel i ActiveMQ - od 25 sekund. Tak więc, kiedy Camel próbuje przekierować wiadomość do/z ActiveMQ, jeśli ActiveMQ potrzebuje więcej niż 25 sekund, aby ukończyć tę odpowiedź, chcę, aby wątek został zakończony z wdziękiem. Oczywiście, jeśli możliwe jest również skonfigurowanie pewnego rodzaju przełączania awaryjnego (tak, aby żądania, które limit czasu może zostać odtworzony w przyszłości), jest znacznie bardziej korzystne niż tylko utrata wiadomości!

Jak mogę to zrobić? Z góry dziękuję!

Aktualizacja: jeśli Camel/JMS/ActiveMQ nie obsługuje tego po wyjęciu z pudełka, nie przeszkadza mi pisać własne „ThreadManager”, który przerywa/zatrzymuje wątki po 25-sekund, ale nie jestem upewnij się, jaki interfejs/klasy implementować/rozszerzać, a następnie połączyć się z moimi komponentami Spring.

+0

Może gdyby Ustawiłem 'expiryTimeout' na moim' PooledConnectionFactory'? – IAmYourFaja

Odpowiedz

1

Domyślnie żądanie aktywnego podania Camel upływa po 20 sekundach.

Dla limitów czasu wysyłania istnieje właściwość sendTimeout w org.apache.activemq.ActiveMQConnectionFactory. Sprawdź także opcję requesttimeout dla JMSConfiguraiton.

W przypadku przełączania awaryjnego można ustawić transport przełączania awaryjnego w adresie URL brokera.

+0

Dzięki @ user-soma (+1) - jak nazywa się 20-sekundowy limit czasu ActiveMQ? Jaka jest różnica między tym przekroczeniem limitu czasu a "limitem czasu wysłania", o którym wspomniałeś? Dzięki jeszcze raz! – IAmYourFaja

+0

@DirtyMikeAndTheBoys - Rozumiem, że czas oczekiwania na żądanie wielbłąda jms i czas wysyłania ActiveMQConnectionFactory służą temu samemu celowi, tj., Aby poinformować producenta o przekroczeniu limitu czasu. Wygaśnięcie wiadomości wskazuje na czas ważności wiadomości. Daje to wskazówkę dla brokera, aby nie wysyłał wygasłych wiadomości do konsumenta. timeToLive na jmsconfiguration wskazuje na to. – techuser

1

prostu ustawić właściwość timeout na brokerURL

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

będzie propagować błąd z powrotem do producenta, dzięki czemu można obsługiwać go zamiast po prostu blokuje nić zawsze ...

Powiązane problemy