JMS 事务简单示例

JMS Transaction simple example

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

感谢 Claus 的回答,我已将 redeliveryPolicy 更改为:

    <property name="redeliveryPolicy">
        <bean class="org.apache.activemq.RedeliveryPolicy">
            <property name="maximumRedeliveries" value="-1" />
            <property name="initialRedeliveryDelay" value="2000" />
            <property name="redeliveryDelay" value="60000" />
            <property name="useExponentialBackOff" value="false"/>
        </bean>
    </property>

其实cacheLevelName参数也需要改成:

<property name="cacheLevelName" value="CACHE_CONSUMER" />

默认值 (CACHE_AUTO)、CACHE_NONE 和 CACHE_SESSION 导致奇怪的重新传递延迟为 0。