2014-12-18 3 views
1

나는 camel과 activeMq를 사용하는 재시도 메커니즘을 만들고 있습니다. 내가하고 싶은 일은 재시도 메커니즘을 시작하는 것이다. 서버 중 하나가 작동을 멈추고 대기열에 요청을 추가하고 몇 시간에 한 번씩 서버에 다시 보내면된다. 내 재시도 정책을 무시한 것 같습니다. (내 요청은 대기열에 들어 왔을 때 재전송되며 다시 시도 횟수에 도달하면 절대로 DLQ에 추가되지 않습니다.)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 구성이 무시되고 예외가 throw되면 다시 시도가 제대로 수행되지 않는다는 것입니다 . 나는 이것이 재시도 메커니즘을 구현할 때 처음이 아니며 청사진에 정확한 설정이 사용되었다는 것을 언급해야한다. – Roxana