Как создать несколько экземпляров подписчиков темы activemq, используя виртуальные места назначения? - PullRequest
5 голосов
/ 03 января 2012

У меня есть издатель, который отправляет сообщения в тему. У меня есть несколько подписчиков, каждый из которых выполняет свою задачу, как только они получают сообщение из темы. Теперь я хочу, чтобы моя система масштабировалась на несколько экземпляров одного и того же процесса, запущенного на разных хостах / одном хосте. например Я хочу запустить несколько копий своего приложения A на разных хостах, чтобы, если один экземпляр A работал медленно, другие экземпляры могли получать последующие сообщения и продвигаться вперед. Я узнал, что это возможно с использованием виртуальных направлений. Я следовал за шагами здесь - http://activemq.apache.org/virtual-destinations.html

Но как мне настроить нескольких подписчиков на одну и ту же тему с одинаковым идентификатором клиента? когда я пытаюсь сделать это, я получаю ошибки. когда я пытаюсь по-другому, это не работает. может кто-нибудь помочь?

Обычно я запускаю подписчика, выполняя следующие шаги -

        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, ActiveMQConnection.DEFAULT_BROKER_URL;);
        activeMQConnection = connectionFactory.createConnection();

        activeMQConnection.setClientID("subscriber1");
        activeMQConnection.setExceptionListener(exceptionListener);
        activeMQSession = activeMQConnection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
        activeMQTopic = activeMQSession.createTopic("myTopic");            
        activeConsumer = activeMQSession.createDurableSubscriber(activeMQTopic, "myTopic");            
        activeConsumer.setMessageListener(messageListener);
        activeMQConnection.start();

когда я пытаюсь создать второго подписчика и передать имя темы как "VirtualTopic.myTopic", ничего не происходит.

спасибо

Ответы [ 2 ]

5 голосов
/ 09 января 2012

Функция виртуальных тем очень проста и достаточно мощна, если вы ее понимаете.

  1. При использовании виртуальных тем нет необходимости в постоянных потребителях.Это потому, что для каждого клиента вы получите экземпляр обычной очереди.Если у вас есть 5 клиентов (приложения A, B, C, D, E), вы получите 5 очередей, которые будут создаваться и заполняться копией сообщений каждый раз, когда сообщение отправляется в виртуальную тему.

  2. На самом деле это ограничение длительного пользования - разрешено только ОДНО соединение для clientId.Будучи обычной очередью, вы можете создать столько потребителей, сколько захотите, и очередь гарантирует, что 1 сообщение получит только 1 потребитель.Поэтому, если у вас есть приложение A, которое обрабатывает сообщение за 1 минуту, вы можете создать 5 его экземпляров, прослушивающих одну и ту же очередь.Когда вы отправите 5 сообщений в течение 1 секунды, каждое ваше приложение получит собственное сообщение для обработки.

  3. Не существует хорошо документированных требований, которые не являются интуитивно понятными.Чтобы виртуальная тема работала, вам нужно

    • Использовать VirtualTopic. в названии вашей темы, например VirtualTopic.Orders (этот префикс можно настроить)
    • Использовать Consumer. в именииз очереди вы.Например, Consumer.ApplicationA.VirtualTopic.Orders, где ApplicationA на самом деле является идентификатором вашего клиента
    • Используйте обычных недолговечных подписчиков для очереди выше.

Пример:

string activeMqConsumerTopic = "Consumer.AmqTestConsumer.VirtualTopic.Orders";

IQueue queue = SessionUtil.GetQueue(session, activeMqConsumerTopic);

IMessageConsumer consumer = session.CreateConsumer(queue);

Очередь создается автоматически каждый раз, когда на нее подписывается первый экземпляр потребителя.С этого момента все сообщения, отправляемые в тему, дублируются / копируются во все связанные очереди.

Надеюсь, это поможет.

1 голос
/ 01 августа 2012

Виртуальные темы - это ответ для вас. Однако вы должны определить стандарт именования для всех очередей виртуальных тем. Вот ответ для этого:

Виртуальные темы помогают со следующими перспективами: 1. Балансировка нагрузки сообщений 2. Быстрое восстановление после отказа абонента 3. Повторное использование одной и той же фабрики соединений для разных производителей и потребителей. (Для постоянных подписчиков требуется уникальный идентификатор клиента JMS, который нельзя использовать повторно для любого другого производителя или потребителя)

вот способ сделать это, ниже пример создает префикс VTCON. *. Таким образом, каждая очередь с этим префиксом и именем темы в конце получит сообщение.

<virtualDestinations> <virtualTopic name="TEST.TP01" prefix="VTCON.*." selectorAware="false"/> </virtualDestinations>

http://workingwithqueues.blogspot.com/2012/05/activemq-virtual-topics-or-virtual.html

...