Открыть сервис

JMS

JMS (Java Message Service, рус. Служба сообщений Java) — это стандарт Java Message Service (JMS) для взаимодействия между приложениями на платформе Java Enterprise Edition (Java EE, Enterprise Edition, рус. Корпоративное издание Java). JMS предоставляет набор интерфейсов и абстракций для асинхронного обмена сообщениями между компонентами распределённых систем, гарантируя надёжную доставку данных и слабую связанность отправителя и получателя. Спецификация JMS определена в Java Community Process (JCP) как стандартный запрос на улучшение Java Specification Request 914 (JSR 914). JMS является ключевым компонентом корпоративных информационных систем (EIS, Enterprise Information Systems, рус. Корпоративные информационные системы), используемых в финансовом секторе, телекоммуникациях, логистике и других отраслях, где требуется масштабируемость и отказоустойчивость.

Общие сведения

JMS — это API (Application Programming Interface, рус. Интерфейс программирования приложений) для Java, который позволяет приложениям создавать, отправлять, получать и читать сообщения. В отличие от синхронных протоколов, таких как удалённый вызов процедур (RPC, Remote Procedure Call, рус. Удалённый вызов процедур) или RMI (Remote Method Invocation, рус. Удалённый вызов методов), JMS поддерживает асинхронную модель обмена, что делает её незаменимой для высоконагруженных и географически распределённых систем. JMS не является транспортным протоколом (например, HTTP, TCP/IP), а представляет собой набор абстракций, реализуемых брокерами сообщений (message brokers, рус. Брокеры сообщений), такими как Apache ActiveMQ, IBM MQ, RabbitMQ, Oracle WebLogic, TIBCO EMS и другими.

Основные поставщики JMS (провайдеры):

История

Первая версия спецификации JMS 1.0 была опубликована в 1999 году компанией Sun Microsystems (впоследствии приобретена Oracle Corporation; признана в РФ в качестве правопреемника Sun, однако сама компания Oracle не признана запрещённой или экстремистской в РФ), с целью унификации разрозненных протоколов обмена сообщениями между Java-приложениями. До появления JMS каждый поставщик (например, IBM MQ, TIBCO Rendezvous) имел собственный API, что усложняло интеграцию. Версия 1.1 (2002 год) ввела унифицированную модель для очередей и тем, устранив дублирование классов. В 2013 году вышла JMS 2.0 (JSR 343), которая упростила API, добавила поддержку инъекции зависимостей (Dependency Injection, рус. Внедрение зависимостей), улучшила обработку исключений и ввела новые типы сообщений. На текущий момент основными версиями являются JMS 2.0 и 2.1 (последнее обновление — 2020 год).

Архитектура и компоненты

Основные элементы

JMS оперирует следующими абстракциями:

Модели обмена

JMS поддерживает две основные модели обмена сообщениями:

  1. Point-to-Point (P2P, рус. «Точка-точка») — через очереди (Queue). Сообщение отправляется в очередь и доставляется одному потребителю. Если потребителей несколько, сообщение обрабатывается только одним (балансировка нагрузки). Модель гарантирует доставку (если настроена персистентность) и порядок приёма.
  2. Publish-Subscribe (Pub/Sub, рус. «Издатель-подписчик») — через темы (Topic). Сообщение публикуется в тему и доставляется всем активным подписчикам. Если подписчик отключён в момент отправки, он не получит сообщение (если не используется долговременная подписка — durable subscription).

Типы сообщений

JMS 2.0 определяет пять типов сообщений:

Применение

Корпоративные системы

JMS активно применяется для построения архитектуры, основанной на сообщениях (message-driven architecture, рус. Архитектура, управляемая сообщениями). Примеры использования:

Java EE и Jakarta EE

В составе Java EE (ныне Jakarta EE, рус. Джакарта EE) JMS является обязательным компонентом для серверов приложений, сертифицированных по этой спецификации. Также JMS используется в связке с EJB (Enterprise JavaBeans, рус. Компоненты корпоративных Java-объектов), в частности с MDB (Message-Driven Beans, рус. Бобы, управляемые сообщениями), которые автоматически обрабатывают сообщения из очередей.

Сочетание с другими протоколами

JMS часто дополняет или заменяет менее надёжные механизмы интеграции, такие как HTTP-запросы (REST API) или SOAP. По сравнению с синхронными вызовами JMS обеспечивает:

Критика и ограничения

Несмотря на зрелость стандарта, JMS имеет следующие недостатки:

Безопасность и транзакции

JMS поддерживает два режима транзакционности:

Для аутентификации и авторизации JMS полагается на провайдерские механизмы: SSL/TLS-шифрование, LDAP-аутентификация и списки доступа (ACL, Access Control List, рус. Список управления доступом).

Пример кода (учебный)

Ниже приведён фрагмент кода на Java (JMS 2.0, простая отправка текстового сообщения в очередь):

```java import javax.jms.*;

public class JmsExample { public static void main(String[] args) throws JMSException { // Создание фабрики соединений (зависит от провайдера, например ActiveMQ) ConnectionFactory factory = new org.apache.activemq.ActiveMQConnectionFactory("tcp://localhost:61616"); try (Connection connection = factory.createConnection()) { connection.start(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageProducer producer = session.createProducer(new ActiveMQQueue("TestQueue")); TextMessage message = session.createTextMessage("Привет, JMS!"); producer.send(message); } } } ```

Связанные технологии

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →