我尝试实现一个简单的jms事务测试。我想检查路由中发生异常后,我的消息是否保留在ActiveMQ代理的队列中。
在此测试中,在将新消息发布到队列中之后,该异常发生了,但是该消息不再像我期望的那样在队列中。我想念什么?下面的蓝图代码
<bean id="jmstx" class="org.apache.camel.component.jms.JmsComponent">
<property name="configuration" ref="jmsConfig" />
</bean>
<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
<property name="connectionFactory" ref="jmsConnectionFactory" />
<property name="transactionManager" ref="jmsTransactionManager" />
<property name="transacted" value="true" />
<property name="cacheLevelName" value="CACHE_CONNECTION" />
</bean>
<bean id="jmsTransactionManager"
class="org.springframework.jms.connection.JmsTransactionManager">
<property name="connectionFactory" ref="jmsConnectionFactory" />
</bean>
<bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://localhost:61616" />
<property name="userName" value="smix" />
<property name="password" value="smix" />
<property name="redeliveryPolicy">
<bean class="org.apache.activemq.RedeliveryPolicy">
<property name="maximumRedeliveries" value="0" />
</bean>
</property>
</bean>
<bean id="myEx" class="java.lang.Exception" />
<camelContext id="ctx_m27" xmlns="http://camel.apache.org/schema/blueprint">
<route id="rt_m27_01" trace="false" autoStartup="true">
<from uri="jmstx:queue:Q.m27_IN" />
<throwException ref="myEx" />
<to uri="jmstx:queue:Q.m27_OUT" />
</route>
</camelContext>
最佳答案
您已将代理配置为不使用重新交付,例如
<property name="maximumRedeliveries" value="0" />
因此,当事务失败时,不会重新传递消息,然后代理将消息移至其死信队列(DLQ)。所以消息在那里。
您可以在此处阅读有关ActiveMQ中的DLQ的更多信息:http://activemq.apache.org/message-redelivery-and-dlq-handling.html