ActiveMQ: начинающий потребитель без брокера - PullRequest
3 голосов
/ 29 ноября 2010

Я пишу клиент JMS, который использует из очереди. Мой брокер activemq, если это имеет значение.

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

Проблема в том, что в моем коде:

connectionFactory = new ActiveMQConnectionFactory(url);
Connection connection = connectionFactory.createConnection();
connection.start()

Если брокер не работает, он застревает в connection.start(). В то время как я хотел бы, чтобы connection.start() молча возвращался и продолжал пытаться подключаться в фоновом режиме и принимать сообщения, пока он может, и молчать, когда нет.

Как мне этого добиться.

Ответы [ 5 ]

1 голос
/ 25 февраля 2011

Просто для потомков, я бы настоятельно рекомендовал использовать SpringMessageListenerContainer для потребления сообщений, после настройки с использованием следующего фрагмента кода :

<jms:listener-container>
    <jms:listener destination="queue.orders" ref="orderService" method="placeOrder"/>
</jms:listener-container>

он позаботится о подключении к инфраструктуре очереди jms с вашими конкретными требованиями (если инфраструктура JMS не работает, контекст приложения все равно будет загружен, но поток повторных попыток будет пытаться восстановить соединение каждые несколько секунд).

1 голос
/ 30 ноября 2010

Существует два способа обойти этот тип сценария, один из которых описан в AMQ-2114:

  1. Используя URI посредника, который был предложен в AMQ-2114. Используя URI посредника, который предлагается в AMQ-2114, создается встроенный посредник с сетевым подключением к удаленному посреднику. Однако, как было указано, этот URI посредника не использует соединитель отработки отказа.

  2. При использовании встроенного брокера, который вручную настроен на использование сети брокеров. Я использовал это в прошлом, когда экземпляр брокера ActiveMQ встроен в ваше приложение Java и настроен для сетевого подключения к удаленному брокеру. Это позволит вашему клиенту подключаться к встроенному брокеру без зависаний и будет отправлять сообщения встроенному брокеру. Сообщения будут передаваться от встроенного посредника к удаленному посреднику, но только тогда, когда существует потребительский спрос на сообщения на удаленном посреднике (т.е. потребитель подключается к удаленному посреднику и запрашивает сообщения). Соединение со встроенным посредником может использовать отказоустойчивый транспорт, а сетевое соединение с удаленным посредником также может использовать отказоустойчивый транспорт.

Пример, который я привел для этого решения, - это пример использования Java-приложения на ноутбуке продавца. Такое приложение должно продолжать работать, даже если продавец не подключен к своей офисной сети. Решение заключается в том, чтобы встроить посредника в приложение Java, чтобы приложение не зависало при отправке сообщений, даже если оно не подключено к офисной сети. Когда приложение снова подключается к офисной сети, оно автоматически подключается к другому посреднику, и сообщения будут передаваться.

Брюс

1 голос
/ 29 ноября 2010

Использовать отдельные потоки для использования из очереди и запуска соединения.Вам нужно будет использовать параллельную реализацию очереди.

Поток 1:

  • Создание очереди
  • Начать поток 2
  • Попытаться подключиться / заблокировать
  • Добавление сообщений в очередь

Поток 2 (или какой-то пул):

  • Запуск клиента
  • Чтение из очереди/ block
  • Обработка сообщений
0 голосов
/ 29 ноября 2010

Я сейчас тоже борюсь с этой проблемой. См. AMQ-2114 .

Я не совсем понимаю принятый ответ, поэтому я предлагаю вознаграждение.

Я использую C ++ версию ActiveMQ. Но я считаю, что это не должно сильно отличаться.

Я думал о вызове connection.start () в отдельном потоке и вызове и вызове connection-> createSession () в TransportListener :: transportResumed (). Но createSession зависает.

Итог, у меня нет рабочего решения, и я рад узнать другое решение проблемы.

0 голосов
/ 29 ноября 2010

Я думаю, что ActiveMQ имеет протоколы (много протоколов ....) для изменения поведения соединения.Попробуйте использовать 'failover: //' или что-то подобное в вашем URL и посмотрите, как это работает.

...