Как сохраняется порядок в ActiveMQ? - PullRequest
0 голосов
/ 21 апреля 2011

Я настроил приложение для прослушивания темы 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 Ответ

2 голосов
/ 21 апреля 2011

Это работает так, как и должно быть, такова природа обработки транзакционных сообщений.Вы не можете обрабатывать другие сообщения до тех пор, пока первое из них не будет завершено или не будет отклонено в соответствии с правилами, указанными в данной политике возврата.

Возможно, вам захочется прочитать учебник по JMS здесь :

...