我已配置Camel路由以将文件从目录传输到ActiveMQ队列。
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}}");
}
}
我的Camel上下文文件如下所示:
<!-- 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>
我在应用程序中的各种不同端点之间有几条其他路由,这些路由需要重新传递配置并且行为符合预期。但是,此特定路由类型(从文件到队列)似乎不遵循我已配置的任何重新传递策略。当我关闭ActiveMQ代理时,路由会尝试每6秒重新传输一次文件。:
10:54:09,979 |信息| C_demo%5 | route6 | 105 - org.apache.camel.camel-core - 2.10.0.redhat-60024 |传递文件
10:54:11,072 |警告| C_demo%5 | TransactionErrorHandler | 105 - org.apache.camel.camel-core - 2.10.0.redhat-60024 |事务回滚(0x5757baa8)redelivered(unknown)for(MessageId:ID-3668-1385561154291-4-1 on ExchangeId:ID-3668-1385561154291-4-2)catch:无法创建JMS事务;嵌套异常是javax.jms.JMSException:无法连接到代理URL :.原因:java.net.ConnectException:连接被拒绝:连接
10:54:11,072 |警告| C_demo%5 | GenericFileOnCompletion | 105 - org.apache.camel.camel-core - 2.10.0.redhat-60024 |回滚文件策略:org.apache.camel.component.file.strategy.GenericFileDeleteProcessStrategy@789d315e for file:GenericFile []
10:54:16,088 |信息| C_demo%5C | route6 | 105 - org.apache.camel.camel-core - 2.10.0.redhat-60024 |传递文件
10:54:17,088 |警告| C_demo%5C | TransactionErrorHandler | 105 - org.apache.camel.camel-core - 2.10.0.redhat-60024 |捕获的事务回滚(0x5757baa8)重新传递(未知)(在ExchangeId上为MessageId:ID-3668-1385561154291-4-3:ID-3668-1385561154291-4-4):无法创建JMS事务;嵌套异常是javax.jms.JMSException:无法连接到代理URL :.原因:java.net.ConnectException:连接被拒绝:连接
10:54:17,088 |警告| C_demo%5 | GenericFileOnCompletion | 105 - org.apache.camel.camel-core - 2.10.0.redhat-60024 |回滚文件策略:org.apache.camel.component.file.strategy.GenericFileDeleteProcessStrategy@789d315e for file:GenericFile []
我查看了transactional client documentation和其他网站,但一直无法找到解决方案。如果我错过了告诉我如何解决这个问题的事情,我道歉。任何有助于解决此问题的指针或文档将不胜感激。谢谢!
答案 0 :(得分:1)
我已经能够通过稍微改变路线来配置路线:
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}}");
}
}
主要变化来自骆驼背景:
<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>
这些更改允许我配置路由尝试将文件重新发送到队列的频率。 我能够使用这些链接获得帮助:
答案 1 :(得分:0)
从Error handling in Camel我了解Camel不处理事务错误。它应该通过支持系统或Transaction ErrorHandler
来完成