Как установить ActiveMQ redeliveryPolicy в очереди? - PullRequest
11 голосов
/ 17 марта 2011

Как установить redeliveryPolicy в ActiveMQ для очереди?

1) В документе см .: activeMQ Redelivery , объяснение, которое следует установитьэто на ConnectionFactory или Connection.Но я хочу использовать разные значения для разных очередей.

2) Кроме того, мне кажется, что это не работает.Установка его на фабрике соединений в Spring (я использую activemq 5.4.2. С Spring 3.0), как это, кажется, не имеет никакого эффекта:

<amq:connectionFactory id="amqConnectionFactory" brokerURL="${jms.factory.url}" >
    <amq:properties>
        <amq:redeliveryPolicy maximumRedeliveries="6" initialRedeliveryDelay="15000" useExponentialBackOff="true" backOffMultiplier="5"/>
    </amq:properties>
</amq:connectionFactory>

Я также попытался установить его как свойство наопределенная очередь, но это также, похоже, игнорируется, поскольку повторная доставка происходит раньше, чем определенные значения:

<amq:queue id="jmsQueueDeclarationSnd"  physicalName="${jms.queue.declaration.snd}" >
    <amq:properties>
        <amq:redeliveryPolicy maximumRedeliveries="6" initialRedeliveryDelay="15000" useExponentialBackOff="true" backOffMultiplier="5"/>
    </amq:properties>
</amq:queue>

Спасибо

Ответы [ 4 ]

8 голосов
/ 29 октября 2012

Я тоже использовал метод, показанный Иваном выше для amq: connectionFactory

При обновлении до ActiveMQ 5.7.0 я заметил, что это больше не работает (так как реализация https://issues.apache.org/jira/browse/AMQ-3224). В любом случае после прочтения лучшего сообщения на форумах ActiveMQ, которое я в настоящее время использую: -

<amq:queue id="emailQueue" physicalName="emailQueue" />
<amq:queue id="smsQueue" physicalName="smsQueue" />

<!-- Wait 15 seconds first re-delivery, then 45, 135, 405, 1215, 3645 seconds -->
<bean id="redeliveryPolicy" class="org.apache.activemq.RedeliveryPolicy">
    <property name="backOffMultiplier" value="3" />
    <property name="initialRedeliveryDelay" value="15000" />
    <property name="maximumRedeliveries" value="6" />
    <property name="queue" value="*" />
    <property name="redeliveryDelay" value="15000" />
    <property name="useExponentialBackOff" value="true" />
</bean>

<amq:connectionFactory id="jmsFactory" brokerURL="yourProtocol/BrokerURL">
    <property name="redeliveryPolicy" ref="redeliveryPolicy" />
</amq:connectionFactory>

Обратите внимание, что для любых сообщений, которые не могут быть доставлены после 6 попыток, ActiveMQ создаст DLQ.emailQueue 'илиDLQ.smsQueue и поставить в очередь сообщение в этой очереди (исключив его из исходной очереди).

5 голосов
/ 17 марта 2011

Я установил его на заводе, как описано выше, но только при создании фабрики соединений в виде Spring-компонента, а не через XBean, как показано выше. Это потому, что xsd не позволяет вам устанавливать redeliveryPolicy как объект, а просто как строку. После установки уровня кэша в Consumer в Spring в DefaultMessageListenerContainer, все заработало.

В очереди кажется, что вы просто можете установить политику доставки ... Странно, так как я хотел бы иметь разные настройки для разных очередей / тем. Просто представьте, что у вас медленная и быстрая очередь, или к внешней системе, к которой вы подключаетесь, требуется больше времени для восстановления. Может быть, эта функция еще не реализована

3 голосов
/ 16 мая 2012

Вы можете установить redeliveryPolicy в пространстве имен amq следующим образом:

<amq:connectionFactory id="jmsRedeliverConnectionFactory" brokerURL="vm://localhost">
  <amq:redeliveryPolicy>
    <amq:redeliveryPolicy maximumRedeliveries="5" initialRedeliveryDelay="1000" useExponentialBackOff="true" backOffMultiplier="5" />
  </amq:redeliveryPolicy>
</amq:connectionFactory>
1 голос
/ 30 января 2013

Мне не удалось заставить ActiveMQ (5.7.0) распознать мою политику повторной доставки, когда я определил ее с помощью <amq:properties> в ConnectionFactory или в очереди (она продолжала использовать политику повторной доставки по умолчанию). Что сработало для меня так:

  • Создайте RedeliveryPolicy как отдельный компонент, а затем Spring-ссылку на него в ConnectionFactory
  • Создать явный DLQ и ссылаться на Spring в RedeliveryPolicy

Spring конфигурируется следующим образом:

<amq:connectionFactory id="jmsFactory" brokerURL="vm://localhost" redeliveryPolicy="#activeMQRedeliveryPolicy" />

<amq:redeliveryPolicy id="activeMQRedeliveryPolicy" destination="#myDLQ" useExponentialBackOff="true" backOffMultiplier="3" maximumRedeliveries="4" />

<amq:queue id="myDLQ" physicalName="DLQ.myDLQ" />
...