나는 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를 구성 할 때 잘못했는지 말해줘. 정말 감사 할거야!
감사합니다, 록 사나
그게 내가하고있는 일이다. 예외 만 처음으로 잡아서 대기열에 메시지를 추가합니다. 메시지가 소비 될 때보 다 예외가 다시 시작될 수 있도록 다시 시도 할 수 있도록 설정했지만 문제는 위에서 게시 한 ActiveMQ 구성이 무시되고 예외가 throw되면 다시 시도가 제대로 수행되지 않는다는 것입니다 . 나는 이것이 재시도 메커니즘을 구현할 때 처음이 아니며 청사진에 정확한 설정이 사용되었다는 것을 언급해야한다. – Roxana