JMS Transaction简单的例子

时间:2015-01-07 11:00:56

标签: apache-camel

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

2 个答案:

答案 0 :(得分:3)

您已将代理配置为不使用重新传递,例如

<property name="maximumRedeliveries" value="0" />

因此,当事务失败时,不重新传递消息,然后代理将消息移动到其死信队列(DLQ)。所以信息就在那里。

您可以在此处阅读有关ActiveMQ中DLQ的更多信息:http://activemq.apache.org/message-redelivery-and-dlq-handling.html

答案 1 :(得分:2)

感谢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。