Как установить ActiveMQ Redeliverypolicy в очередь?
-
26-10-2019 - |
Вопрос
Как установить Redeliverypolicy в ActiveMQ на очередь?
1) В документе см.: ActiveMQ Redeliaily, объясните, что вы должны установить его на ConnectionFactory или Connection. Но я хочу использовать разные значения для разных очередей.
2) Кроме того, я, кажется, не заставляю это работать. Установка его на заводе подключения весной (я использую ActiveMQ 5.4.2. С пружиной 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>
Спасибо
Решение 2
Я получил его, установив его на фабрике, как это сделано выше, но только при создании фабрики соединения в качестве пружинного боба, а не через XBEAN, как показано выше. Это потому, что XSD не позволяет вам установить Redeliverypolicy как объект, а просто как строка. После установки уровня кэша для потребителя в Spring's DefaultMessageListenerContainer все это сработало.
В очереди кажется, что вы просто можете установить политику доставки ... странно, так как я хотел бы иметь разные настройки для разных тем/тем. Только представьте, что у вас есть медленная и более высокая очередь или внешняя система, к которой вы подключаетесь, которая требует больше времени для восстановления ... возможно, эта функция еще предстоит реализовать
Другие советы
Я тоже использовал метод, показанный Иваном выше для 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 и включить сообщение об этой очереди (вытащив его из исходной очереди).
Вы можете установить 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>
Я не мог получить ActiveMQ (5.7.0), чтобы распознать мою политику переоборудования, когда я определил ее, используя <amq:properties>
На ConnectionFactory или в очереди (он продолжал использовать политику переоборудования по умолчанию). Что сработало для меня, так это следующее:
- Создайте Redeliverypolicy в качестве отдельного боба, а затем снимайте его в подключении кфактори
- Создайте явную DLQ и Spring Reference IT в Redeliverypolicy
Конфигурация пружины следующим образом:
<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" />