2014-12-18 2 views
1

Я работаю над механизмом повтора с использованием верблюда и activeMq. Что я хочу сделать, так это запустить механизм повтора, если один из серверов, с которых я звоню, отключен, добавьте запрос в мою очередь и от часа до часа отправьте его на сервер. Все работает отлично, за исключением моей политики повтора, которая, как представляется, игнорируется (мои запросы не отправляются, когда они попадают в мою очередь, и они никогда не добавляются в DLQ после достижения количества попыток)Retry механизм с помощью Camel и ActiveMq - политика повтора игнорируется

Моя конфигурация выглядит следующим образом (значения являются прочитанные из файла .cfg):

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 
<bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> 
    <property name="brokerURL" value="${activemq.broker.url}"/> 
    <property name="userName" value="${activemq.broker.username}"/> 
    <property name="password" value="${activemq.broker.password}"/> 
    <property name="redeliveryPolicy" ref="policy"/> 
</bean> 

<bean id="policy" class="org.apache.activemq.RedeliveryPolicy"> 
    <property name="queue" value="*"/> 
    <property name="initialRedeliveryDelay" value="${activemq.redelivery.delay}"/> 
    <property name="redeliveryDelay" value="${activemq.redelivery.delay}"/> 
    <property name="useExponentialBackOff" value="false"/> 
    <property name="maximumRedeliveries" value="${activemq.number.of.redeliveries}"/> 
</bean> 

<bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory"> 
    <property name="maxConnections" value="8"/> 
    <property name="connectionFactory" ref="jmsConnectionFactory"/> 
</bean> 

<bean id="jmsTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager"> 
    <property name="connectionFactory" ref="pooledConnectionFactory"/> 
</bean> 

<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration"> 
    <property name="connectionFactory" ref="pooledConnectionFactory"/> 
    <property name="transactionManager" ref="jmsTransactionManager"/> 
    <property name="transacted" value="true"/> 
    <property name="cacheLevelName" value="CACHE_CONSUMER"/> 
    <property name="concurrentConsumers" value="8"/> 
</bean> 

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

маршрут

верблюд, который называет свою службу:

<route id="addRegistrationRoute"> 
     <from uri="direct:addRegistrationRoute"/> 

     <to uri="cxf:bean:addRegistrationEndpoint"/> 

     <onException> 
      <exception>java.net.ConnectException</exception> 
      <onWhen> 
       <el>${in.headers['previousRoute'] != 'registrationRetryRoute'}</el> 
      </onWhen> 
      <handled> 
       <constant>true</constant> 
      </handled> 

      <setBody> 
       <simple>${headers.request}</simple> 
      </setBody> 
      <removeHeaders pattern="*"/> 
      <to uri="activemq:queue:registrationRetryQueue"/> 
      <stop/> 
     </onException> 
     <onException> 
      <exception>org.apache.cxf.interceptor.Fault</exception> 
      <onWhen> 
       <el>${in.headers['previousRoute'] != 'registrationRetryRoute'}</el> 
      </onWhen> 
      <handled> 
       <constant>true</constant> 
      </handled> 

      <setBody> 
       <simple>${headers.request}</simple> 
      </setBody> 
      <removeHeaders pattern="*"/> 

      <to uri="activemq:queue:registrationRetryQueue"/> 
      <stop/> 
     </onException> 
     <onException> 
      <exception>javax.xml.soap.SOAPFault</exception> 
      <handled> 
       <constant>true</constant> 
      </handled> 

     </onException> 
    </route> 
    <route id="registrationRetryRoute"> 
     <from uri="activemq:queue:registrationRetryQueue"/> 

     <setHeader headerName="previousRoute"> 
      <simple>registrationRetryRoute</simple> 
     </setHeader> 
     <to uri="direct:addRegistrationRoute"/> <!-- Back to the initial flow. --> 
    </route> 

Если кто-то может понравиться скажите мне, что я сделал неправильно в настройке activeMq, я буду очень благодарен!

С уважением, Роксана

ответ

0

ActiveMQ толкает сообщения в DLQ только если вы выбрасываете ошибку от ваших потребителей (слушателей или сообщений). Поэтому попробуйте поймать свое исключение и отбросьте его, чтобы политика повторного запуска была включена соответствующим образом.

+0

Это то, что я делаю. Я поймаю исключение только в первый раз, и я добавляю сообщение в очередь. Затем, когда сообщение становится потребляемым, я разрешаю исключить исключение, чтобы повторить попытку, но проблема в том, что конфигурация ActiveMQ, которую я опубликовал выше, игнорируется, а когда исключение выбрано, повторение выполняется неправильно , Я должен упомянуть, что это не первый случай, когда я реализую механизм повтора, и точная конфигурация была использована с планом. – Roxana

Смежные вопросы