Что такое JMS и как его использовать в Java?

«Что такое JMS и как его использовать в Java?» — вопрос из категории Брокеры сообщений, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

JMS (Java Message Service) — это стандартное Java API для асинхронного обмена сообщениями между приложениями или компонентами в рамках системы (Message-Oriented Middleware).

Основные модели обмена:

  1. Очереди (Point-to-Point): Сообщение отправляется в конкретную очередь и доставляется одному потребителю.
  2. Топики (Publish/Subscribe): Сообщение публикуется в топик и доставляется всем активным подписчикам.

Ключевые интерфейсы JMS:

  • ConnectionFactory — фабрика для создания соединений с брокером (ActiveMQ, IBM MQ, etc.).
  • Connection — активное соединение с сервером JMS.
  • Session — контекст для создания и получения сообщений, может быть транзакционным.
  • Destination — адресат сообщения (Queue или Topic).
  • MessageProducer / MessageConsumer — для отправки и приема сообщений.

Пример отправки сообщения в очередь:

import javax.jms.*;
import org.apache.activemq.ActiveMQConnectionFactory;

public class JmsProducer {
    public static void main(String[] args) throws JMSException {
        // 1. Создание фабрики соединений
        ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        // 2. Установка соединения и запуск
        Connection connection = factory.createConnection();
        connection.start();
        // 3. Создание сессии (не транзакционная, авто-подтверждение)
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 4. Создание очереди назначения
        Queue queue = session.createQueue("ORDER.QUEUE");
        // 5. Создание отправителя
        MessageProducer producer = session.createProducer(queue);
        // 6. Создание и отправка текстового сообщения
        TextMessage message = session.createTextMessage("New order #12345");
        producer.send(message);
        System.out.println("Message sent: " + message.getText());
        // 7. Закрытие ресурсов
        session.close();
        connection.close();
    }
}

Практическое применение:

  • Развязка сервисов: Микросервисы общаются через очереди, не зная друг о друге.
  • Гарантированная доставка: Сообщения сохраняются брокером до получения.
  • Асинхронная обработка: Отправитель не блокируется, ожидая ответа.
  • Масштабирование: Можно запускать несколько экземпляров потребителей для одной очереди (конкурентные потребители).