I have configured a Camel route to transfer files from a directory to an ActiveMQ queue.
public class DemoHelperRouteBuilder extends RouteBuilder {
@Override
public void configure() throws Exception {
onException(JmsException.class, ConnectException.class)
.routeId("ConnectionExceptionRoute")
.handled(true)
.log(LoggingLevel.ERROR, "Connection Error")
.maximumRedeliveries(5)
.redeliveryDelay(1000)
.backOffMultiplier(2)
.useExponentialBackOff()
.maximumRedeliveryDelay(60000)
.log(LoggingLevel.DEBUG, "Rolling back!")
.rollback();
errorHandler(defaultErrorHandler()
.maximumRedeliveries(20).redeliveryDelay(7000).retryAttemptedLogLevel(LoggingLevel.INFO));
from("file:{{directory.property}}?delete=true&readLock=markerFile&delay=5000")
.log("Passing File")
.transacted("PROPAGATION_REQUIRED")
.setHeader("FILE_TYPE", constant("MYTYPE"))
.setHeader("MSG_ID", constant("55"))
.to("activemq:{{MY.QUEUE}}");
}
}
My Camel context file looks like this:
<!-- This is the default behavior. -->
<bean id="PROPAGATION_REQUIRED" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
<property name="transactionManager" ref="jmsTransactionManager"/>
</bean>
<bean id="PROPAGATION_REQUIRES_NEW" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
<property name="transactionManager" ref="jmsTransactionManager"/>
<property name="propagationBehaviorName" value="PROPAGATION_REQUIRES_NEW"/>
</bean>
<bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
<property name="connectionFactory" ref="jmsConnectionFactory"></property>
<property name="transacted" value="true"/>
<property name="transactionManager" ref="jmsTransactionManager"/>
</bean>
<bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="${jms.broker.url}"/>
<property name="redeliveryPolicy">
<bean class="org.apache.activemq.RedeliveryPolicy">
<property name="maximumRedeliveries" value="-1" />
<property name="redeliveryDelay" value="10000" />
</bean>
</property>
</bean>
I have several other routes between a variety of different endpoints in the application which require redelivery configuration and are behaving as expected. However, this particular route type (from file to queue) does not seem to follow any of the redelivery policies I have configured. When I bring down the ActiveMQ broker, the route attempts to redeliver the file every 6 seconds.:
10:54:09,979 | INFO | C_demo%5 | route6 | 105 - org.apache.camel.camel-core - 2.10.0.redhat-60024 | Passing File
10:54:11,072 | WARN | C_demo%5 | TransactionErrorHandler | 105 - org.apache.camel.camel-core - 2.10.0.redhat-60024 | Transaction rollback (0x5757baa8) redelivered(unknown) for (MessageId: ID-3668-1385561154291-4-1 on ExchangeId: ID-3668-1385561154291-4-2) caught: Could not create JMS transaction; nested exception is javax.jms.JMSException: Could not connect to broker URL: . Reason: java.net.ConnectException: Connection refused: connect
10:54:11,072 | WARN | C_demo%5 | GenericFileOnCompletion | 105 - org.apache.camel.camel-core - 2.10.0.redhat-60024 | Rollback file strategy: org.apache.camel.component.file.strategy.GenericFileDeleteProcessStrategy@789d315e for file: GenericFile[]
10:54:16,088 | INFO | C_demo%5C | route6 | 105 - org.apache.camel.camel-core - 2.10.0.redhat-60024 | Passing File
10:54:17,088 | WARN | C_demo%5C | TransactionErrorHandler | 105 - org.apache.camel.camel-core - 2.10.0.redhat-60024 | Transaction rollback (0x5757baa8) redelivered(unknown) for (MessageId: ID-3668-1385561154291-4-3 on ExchangeId: ID-3668-1385561154291-4-4) caught: Could not create JMS transaction; nested exception is javax.jms.JMSException: Could not connect to broker URL: . Reason: java.net.ConnectException: Connection refused: connect
10:54:17,088 | WARN | C_demo%5 | GenericFileOnCompletion | 105 - org.apache.camel.camel-core - 2.10.0.redhat-60024 | Rollback file strategy: org.apache.camel.component.file.strategy.GenericFileDeleteProcessStrategy@789d315e for file: GenericFile[]
I have looked at transactional client documentation and other sites, but have been unable to find a solution. If I missed something that tells me how to solve this issue, I apologize. Any pointers or documentation that could help solve this problem will be greatly appreciated. Thanks!
I have been able to configure the route by changing the route slightly:
public class DemoHelperRouteBuilder extends SpringRouteBuilder{
@Override
public void configure() throws Exception {
onException(JmsException.class, ConnectException.class)
.routeId("ConnectionExceptionRoute")
.handled(true)
.log(LoggingLevel.ERROR, "Connection Error")
.maximumRedeliveries(25)
.redeliveryDelay(1000)
.backOffMultiplier(2)
.useExponentialBackOff()
.maximumRedeliveryDelay(60000)
.log(LoggingLevel.DEBUG, "Rolling back!")
.rollback();
errorHandler(transactionErrorHandler()
.maximumRedeliveries(5).redeliveryDelay(60000).retryAttemptedLogLevel(LoggingLevel.INFO));
from("file:{{directory.property}}?delete=true&readLock=markerFile&delay=5000")
.log("Passing File")
.transacted("PROPAGATION_REQUIRED")
.setHeader("FILE_TYPE", constant("MYTYPE"))
.setHeader("MSG_ID", constant("55"))
.to("activemq:{{MY.QUEUE}}");
}
}
The main change came in the the camel context:
<bean id="JMS_TRANSACTED" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
<property name="transactionManager" ref="jmsTransactionManager"/>
</bean>
<bean id="PROPAGATION_REQUIRED" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
<property name="transactionManager">
<osgi:reference interface="org.springframework.transaction.PlatformTransactionManager" />
</property>
<property name="propagationBehaviorName" value="PROPAGATION_REQUIRED" />
</bean>
<bean id="PROPAGATION_REQUIRES_NEW" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
<property name="transactionManager" ref="jmsTransactionManager"/>
<property name="propagationBehaviorName" value="PROPAGATION_REQUIRES_NEW"/>
</bean>
<bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="${jms.broker.url}"/>
<property name="redeliveryPolicy">
<bean class="org.apache.activemq.RedeliveryPolicy">
<property name="maximumRedeliveries" value="-1" />
<property name="redeliveryDelay" value="10000" />
</bean>
</property>
</bean>
These changes allow me to configure how often the route attempts to resend the file to the queue. I was able to use these links for help:
Thanks!