Системы обмена сообщениями (или MOM для промежуточного программного обеспечения, ориентированного на сообщения ) — это системы, ориентированные на отправку и получение сообщений для повышения функциональной совместимости, гибкости и производительности приложений. Они отделяют производителей сообщений от потребителей . Производители и потребители сообщений полностью независимы и не осведомлены друг о друге в пространстве (они могут работать на разных узлах) и во времени (они не должны выполняться одновременно, производители могут отправлять сообщения, даже если их нет). потребители и наоборот). Это позволяет создавать системы более гибкие и слабосвязанные, чем при использовании удаленных вызовов процедур (или RPC ).
Системы обмена сообщениями часто используются для реализации в качестве шины сообщений, которая слабо объединяет разнородные системы. Использование шины сообщений для разъединения разрозненных систем позволяет системам расти независимо и легче адаптироваться. Это обеспечивает большую гибкость при добавлении новых систем или обновлении существующих, поскольку они не имеют хрупких жестких зависимостей друг от друга.
Характеристики
Текущий выпуск
Текущая версия HornetQ — 2.0.0.
Этот выпуск является первым выпуском HornetQ, почему он начинается с 2? На самом деле, HornetQ является духовным наследником JBoss Messaging. По мере того, как команда занималась разработкой следующего поколения JBoss Messaging, она поняла, что это было такое изменение в объеме и дизайне по сравнению с предыдущим проектом, что оно было переименовано, чтобы подчеркнуть его новую более широкую область применения.
- Документация и примеры
HornetQ поставляется с более чем 80 примерами, показывающими все функции по одной, чтобы помочь пользователю понять их. Документация ориентирована на задачи и описывает для каждой функции ее цель, ее использование и конфигурацию.
- API JMS 1.1 — HornetQ предоставляет полный API JMS 1.1 (соединение, сеанс, адресаты и т. Д.) И многое другое (мертвая буква, очередь истечения, очередь последних значений, режим пре-пакета)
- Оптимизированный базовый API — HornetQ также предоставляет собственный клиентский API, который выходит за рамки возможностей JMS, чтобы использовать все функции, предлагаемые HornetQ, которые недоступны через JMS API.
- Гибкая интеграция — HornetQ небольшой, с небольшими зависимостями и может быть использован в соответствии с вашими потребностями. Вы можете запустить его автономно, интегрировать в JBoss Application Server или в другие структуры внедрения зависимостей или напрямую создать экземпляр из своего кода: вы можете интегрировать его по своему усмотрению.
- Поддержка JavaEE. В дополнение к JMS, HornetQ обеспечивает поддержку дополнительных API JavaEE, используемых для корпоративных приложений. HornetQ — это полнофункциональный XAResource, который может быть зачислен в любую транзакцию JTA. HornetQ также предоставляет адаптер JCA, который может использоваться серверами приложений Java EE для приема сообщений через управляемые сообщениями bean-компоненты
- Множество вариантов транспортировки — транспорт HornetQ низкого уровня полностью подключается. Предоставляются две реализации: одна использует Netty для удаленной связи, а другая — реализацию in-vm для подключения клиентов и серверов, работающих на одной виртуальной машине Java. Реализация Netty обеспечивает поддержку TCP, SSL, HTTP и Servlet.
- Управление — HornetQ предоставляет обширный API-интерфейс управления, доступ к которому можно получить с помощью JMX. В качестве альтернативы можно управлять HornetQ, отправляя сообщения на специальный адрес управления. Точно так же уведомления управления, отправляемые серверами HornetQ, могут быть получены с использованием JMX или путем использования сообщений.
- Высокопроизводительный журнал для сохранения сообщений — HornetQ обеспечивает сохранение сообщений, используя собственный встроенный, высокопроизводительный журнал. Этот журнал представляет собой уникальную технологию, которая автоматически обнаруживает, работает ли HornetQ в Linux и использует Linux AIO через нативный уровень кода для удивительной производительности. Если AIO недоступен, журнал без проблем использует Java NIO, чтобы обеспечить отличную производительность на любой платформе Java. Производительность HornetQ 2.0.0 была опубликована с использованием SPECjms2007 .
Есть много других функций, которые описаны на вики-странице HornetQ Features .
Начало работы с HornetQ
Лучший способ начать работу с HornetQ — это загрузить его и запустить один из примеров.
- Загрузите дистрибутив HornetQ:
$ wget http://sourceforge.net/projects/hornetq/files/2.0.0.GA/hornetq-2.0.0.GA.zip/download
- Распакуйте его
$ unzip hornetq-2.0.0.GA.zip
- Перейти к примеру очереди JMS:
$ cd hornetq-2.0.0.GA/examples/jms/queue
- Запустите пример с build.sh:
$ ./build.sh
...
[java] Sent message: This is a text message
[java] Received message: This is a text message
[java] example complete
[java]
[java] #####################
[java] ### SUCCESS! ###
[java] #####################
Этот пример запускает один сервер HornetQ, отправляет и получает текстовое сообщение JMS в очереди и останавливает сервер.
После этого следующим шагом будет чтение документации, чтобы узнать, какие jar-файлы требуются на стороне клиента для использования HornetQ, и начать отправку и получение сообщений из вашего приложения.
Пример клиента
Давайте напишем некоторый код сейчас. Мы будем использовать автономный готовый к использованию сервер HornetQ и напишем клиент JMS для отправки и получения сообщений в очереди.
Во-первых, давайте запустим сервер из дистрибутива HornetQ:
$ cd hornetq-2.0.0.GA/bin/
$ ./run.sh
...
HornetQ Server version 2.0.0.GA (Hornet Queen, 113) started
Теперь мы напишем простой JMS-клиент, который подключится к серверу HornetQ и будет использовать JMS Queue / queue / ExampleQueue, доступную на сервере:
// Step 1. Create an initial context to perform the JNDI lookup.
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.PROVIDER_URL, "jnp://localhost:1099");
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
env.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces ");
Context ctx = new InitialContext(env);
// Step 2. Lookup the connection factory
ConnectionFactory cf = (ConnectionFactory)ctx.lookup("/ConnectionFactory");
// Step 3. Lookup the JMS queue
Queue queue = (Queue)ctx.lookup("/queue/ExampleQueue");
// Step 4. Create the JMS objects to connect to the server and manage a session
Connection connection = cf.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// Step 5. Create a JMS Message Producer to send a message on the queue
MessageProducer producer = session.createProducer(queue);
// Step 6. Create a Text Message and send it using the producer
TextMessage message = session.createTextMessage("Hello, HornetQ!");
producer.send(message);
System.out.println("Sent message: " + message.getText());
// now that the message has been sent, let's receive it
// Step 7. Create a JMS Message Consumer to receive message from the queue
MessageConsumer messageConsumer = session.createConsumer(queue);
// Step 8. Start the Connection so that the server starts to deliver messages
connection.start();
// Step 9. Receive the message
TextMessage messageReceived = (TextMessage)messageConsumer.receive(5000);
System.out.println("Received message: " + messageReceived.getText());
// Finally, we clean up all the JMS resources
connection.close();
// Step 1. Create an initial context to perform the JNDI lookup.
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.PROVIDER_URL, "jnp://localhost:1099");
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
env.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces ");
Context ctx = new InitialContext(env);
// Step 2. Lookup the connection factory
ConnectionFactory cf = (ConnectionFactory)ctx.lookup("/ConnectionFactory");
// Step 3. Lookup the JMS queue
Queue queue = (Queue)ctx.lookup("/queue/ExampleQueue");
// Step 4. Create the JMS objects to connect to the server and manage a session
Connection connection = cf.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// Step 5. Create a JMS Message Producer to send a message on the queue
MessageProducer producer = session.createProducer(queue);
// Step 6. Create a Text Message and send it using the producer
TextMessage message = session.createTextMessage("Hello, HornetQ!");
producer.send(message);
System.out.println("Sent message: " + message.getText());
// now that the message has been sent, let's receive it
// Step 7. Create a JMS Message Consumer to receive message from the queue
MessageConsumer messageConsumer = session.createConsumer(queue);
// Step 8. Start the Connection so that the server starts to deliver messages
connection.start();
// Step 9. Receive the message
TextMessage messageReceived = (TextMessage)messageConsumer.receive(5000);
System.out.println("Received message: " + messageReceived.getText());
// Finally, we clean up all the JMS resources
connection.close();
Чтобы запустить этот код, вам нужно добавить следующие jar-файлы в ваш classpath:
- hornetq-core-client.jar — клиентская библиотека HornetQ
- hornetq-jms-client.jar — клиентская реализация JMS API
- netty.jar — высокопроизводительный клиент / серверный фреймворк
- hornetq-transports.jar — код интеграции для использования Netty с HornetQ
- jnp-client.jar — библиотека JNDI
Как только код скомпилирован, вы можете запустить его:
Sent message: Hello, HornetQ!
Received message: Hello, HornetQ!
Такой простой пример не отражает, насколько мощными и гибкими являются системы обмена сообщениями. Они действительно сияют в сложных гетерогенных системах, где они помогают управлять сложностью и повышать производительность за счет разделения систем.
интеграция
Сервер HornetQ разработан с использованием POJO, чтобы упростить его интеграцию в несколько сред.
HornetQ адаптируется к вашей конкретной среде, а не наоборот. Он может быть запущен автономно (используя JBoss Microcontainer ) или вы можете напрямую создавать экземпляры HornetQ POJO в своем коде для встраивания сервера.
Дистрибутив HornetQ содержит сценарии для его развертывания в JBoss AS 4 & 5, и это будет система обмена сообщениями по умолчанию в JBoss AS 6.
Наконец, HornetQ также будет использоваться в следующей версии TorqueBox для предоставления очередей задач для приложений Ruby.
Расширенные возможности
HornetQ предоставляет расширенные конструкции, помогающие приложениям использовать повторяющиеся шаблоны обмена сообщениями. Давайте представим некоторые из них.
Основные Мосты
Базовые мосты используются для создания потоков сообщений между двумя серверами HornetQ, которые удалены друг от друга. Базовые мосты являются устойчивыми и будут справляться с временными сбоями соединения, что позволяет им быть идеальным выбором для переадресации по ненадежным соединениям, например WAN.
Базовые мосты настраиваются и управляются серверами HornetQ, так что вам не придется обращаться с ними вручную.
Пример конфигурации основного моста выглядит так:
<!-- the bridge will consume message from the "source" and forward them to the "target" -->
<bridge name="my-bridge">
<queue-name>jms.queue.source</queue-name>
<forwarding-address>jms.queue.target</forwarding-address>
<reconnect-attempts>-1</reconnect-attempts>
<connector-ref connector-name="target-connector"/>
</bridge>
Переадресация
Переадресация позволяет прозрачно «перенаправлять» или копировать сообщения с одного адреса на другой с помощью простой конфигурации, определенной на стороне сервера.
Переадресация может быть исключительной — сообщение перенаправляется на новый адрес и не переходит на старый адрес вообще — или неисключительно — сообщение отправляется на старый адрес, а копия сообщения также отправляется на новый адрес.
Например, неэксклюзивные отклонения могут, следовательно, использоваться для разделения потоков сообщений, если существует необходимость отслеживать каждый заказ, отправленный в очередь заказов, без внесения каких-либо изменений в логику клиентского приложения .
Пример конфигурации переадресации выглядит так:
<!-- the divert will divert messages sent to the "orders" queue and also send them to the "monitoring" topic -->
<divert name="order-divert">
<address>jms.queue.orders</address>
<forwarding-address>jms.topic.monitoring</forwarding-address>
<exclusive>false</exclusive>
</divert>
JMS Bridges
Мосты JMS могут получать сообщения JMS из исходного места назначения JMS и отправлять их в целевое место назначения JMS, обычно на другом сервере.
Как и основной мост, мост JMS обладает встроенной устойчивостью к сбоям, поэтому в случае потери соединения с исходным или целевым сервером, например, из-за сбоя в сети, мост будет повторять подключение к источнику и / или цели, пока они не вернутся в оперативный режим. Когда он возвращается в онлайн, он возобновляет работу в обычном режиме.
В отличие от базового моста, мост JMS также может использоваться для соединения сообщений от других серверов JMS, отличных от HornetQ, если они совместимы с JMS 1.1. Это помогает переносить приложения в HornetQ, обеспечивая мост к предыдущим устаревшим системам обмена сообщениями на этапе миграции.
Хочу больше?
Это краткое введение в HornetQ, и многие мощные функции не были упомянуты ( кластеризация , высокая доступность , управление потоком , пейджинг и т. Д.). Если вам нужна дополнительная информация, веб-сайт является основным источником информации.
Последний релиз в краткое руководство и руководство пользователя будет вам отправлять и получать сообщения в кратчайшие сроки. Если у вас возникнут проблемы, спросите сообщество на форуме пользователей или откройте вопросы JIRA .
Вы также можете следить за проектом в Твиттере и в блоге проекта .
Вовлечены?
Если вы хотите принять участие в проекте, присоединяйтесь к команде на IRC-канале #hornetq .