Apache camel JMS事务简单示例

Apache camel JMS事务简单示例,apache-camel,Apache Camel,我尝试实现一个简单的jms事务测试。我想检查在路由中发生异常后,我的消息是否留在ActiveMQ代理的队列中 在这个测试中,异常发生在队列中发布了一条新消息,但该消息不再如我所期望的那样在队列中。我错过了什么?下面是蓝图代码 <bean id="jmstx" class="org.apache.camel.component.jms.JmsComponent"> <property name="configuration" ref="jmsConfig" /> &

我尝试实现一个简单的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的更多信息:

多亏了Claus的回答,我已将重新交付策略更改为:

    <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\u AUTO)、CACHE\u NONE和CACHE\u SESSION会导致奇怪的重新交付延迟为0。

谢谢您的回答。在这个测试中,当事务失败时,我不希望消息被重新传递或移动到DLQ。我只希望消息留在队列中,稍后再进行轮询。此测试用例不是“有害消息”测试,而是“未能交付”测试。例如,sftp生产者不再可用,需要停止路由。读取该链接,设置更高的最大重新交付计数,并在重新交付尝试之间设置更高的延迟,则消息在队列中停留的时间更长