Автоматически удалять неактивных долговременных потребителей в ActiveMQ - PullRequest
1 голос
/ 11 марта 2011

Например, у нас есть постоянный потребитель тем и несколько брокеров по этой теме. Насколько я понимаю, брокер будет продолжать хранить каждое сообщение (в некоторых пределах), даже если этот постоянный потребитель не будет активным в течение очень длительного времени.

Существует ли в ActiveMQ политика какого-либо брокера по уничтожению (автоматическая отмена подписки) неактивных (в течение определенного времени) постоянных потребителей? Так что мне не нужно следить за тем, чтобы все потребители еще действовали и действительно существовали.

Ответы [ 3 ]

2 голосов
/ 24 мая 2016

Это параметры, которые вам нужно установить:

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" schedulePeriodForDestinationPurge="10000" offlineDurableSubscriberTimeout="30000" offlineDurableSubscriberTaskSchedule="10000">
2 голосов
/ 20 сентября 2011

Я бы предложил вам использовать виртуальные темы вместо постоянных потребителей.

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

Затем, когда вы точно знаете, что вашего потребителя больше нет - вы можете удалить очередь со всемиожидающие сообщения в нем.Это можно сделать из кода или вручную через веб-консоль AMQ или jconsole.

РЕДАКТИРОВАТЬ: С виртуальной темой вы получаете новую очередь для каждого отдельного потребителя, поэтому вы можете применить политику очереди кудаляйте его, когда он неактивен в течение указанного периода времени.

В вашем файле activemq.xml gcInactiveDestination = true:

 <destinationPolicy>
        <policyMap>
          <policyEntries>
             <policyEntry queue=">" producerFlowControl="false" 
                      gcInactiveDestinations="true" inactiveTimoutBeforeGC="10000"/>

Подробнее: http://activemq.apache.org/delete-inactive-destinations.html

0 голосов
/ 25 апреля 2015

Ответ выше верен, но не будет работать, пока вы не добавите schedulePeriodForDestinationPurge = "10000" на уровне брокера. Каждые 10 секунд брокер проверяет наличие неактивных очередей, в которых активный абонент не подключен и количество ожидающих сообщений равно нулю. Вы также можете установить более высокое значение.

...