我尝试实现一个简单的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

10-07 23:30