如何在ActiveMQ中保留订购?

时间:2011-04-20 20:35:11

标签: jms activemq publish-subscribe

我已经设置了一个应用程序来监听ActiveMQ主题。这是我配置它的方式:

<jms:listener-container connection-factory="jmsFactory"
    container-type="default" destination-type="durableTopic" client-id="CMY-LISTENER"
    acknowledge="transacted">
    <jms:listener destination="CMY.UPDATES"
        ref="continuingStudiesCourseUpdateListener" subscription="CMY-LISTENER" />
</jms:listener-container>


<bean id="jmsFactoryDelegate" class="org.apache.activemq.ActiveMQConnectionFactory">
    <property name="brokerURL" value="${jmsFactory.brokerURL}" />
    <property name="redeliveryPolicy">
        <bean class="org.apache.activemq.RedeliveryPolicy">
            <property name="maximumRedeliveries" value="10" />
            <property name="initialRedeliveryDelay" value="60000" />
            <property name="redeliveryDelay" value="60000" />
            <property name="useExponentialBackOff" value="true" />
            <property name="backOffMultiplier" value="2" />
        </bean>
    </property>
</bean>

我遇到的问题是:

我在主题中添加了10条消息。

如果读取了第一条消息,并且应用程序无法处理该任务,则会回滚该消息。

1分钟后,它重试读取第一条消息并进行处理。它失败并回滚。

2分钟后,它重试,然后回滚。

4分钟后......等等

它会卡在第一条消息上,接下来的9条消息在第一条消息被处理之后才会被读取。

这是主题应该如何运作的方式吗?有没有一种方法可以在第一个等待重新尝试时读取其他9条消息?

1 个答案:

答案 0 :(得分:2)

它的工作就像它应该的那样,这是事务性消息处理的本质。根据给定的重新传递策略中的规则,您无法处理其他消息,直到第一个消息完成或被丢弃。

可能希望阅读JMS教程here