Skip to content

3. JMSProducer

Конечно! Вот полная реализация JMSProducer.java:

package com.example.jms;

import jakarta.annotation.Resource;
import jakarta.jms.*;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.logging.Logger;
import java.util.logging.Level;

@WebServlet("/producer")
public class JMSProducer extends HttpServlet {
    // Статический логгер для отслеживания событий
    private static final Logger LOGGER = 
        Logger.getLogger(JMSProducer.class.getName());

    // Ресурс подключения к JMS
    @Resource(lookup = "java:/ConnectionFactory")
    private ConnectionFactory connectionFactory;

    // Ресурс очереди сообщений
    @Resource(lookup = "java:/jms/queue/ExampleQueue")
    private Queue queue;

    @Override
    protected void doGet(
        HttpServletRequest request, 
        HttpServletResponse response
    ) throws ServletException, IOException {
        // Установка типа содержимого ответа
        response.setContentType("text/plain");
        PrintWriter out = response.getWriter();

        try {
            // Создание соединения с JMS
            Connection connection = connectionFactory.createConnection();

            try {
                // Создание сессии 
                Session session = connection.createSession(
                    false,  // Без транзакций
                    Session.AUTO_ACKNOWLEDGE // Автоматическое подтверждение
                );

                // Создание продюсера сообщений
                MessageProducer producer = session.createProducer(queue);

                // Создание текстового сообщения
                TextMessage message = session.createTextMessage(
                    "Демо сообщение JMS: " + 
                    java.time.LocalDateTime.now()
                );

                // Добавление заголовков сообщения (опционально)
                message.setStringProperty("sender", "JMSProducerServlet");
                message.setIntProperty("priority", 5);

                // Отправка сообщения с настройкой доставки
                producer.setDeliveryMode(DeliveryMode.PERSISTENT);
                producer.send(message);

                // Логирование и вывод
                LOGGER.info("Сообщение отправлено: " + message.getText());
                out.println("Сообщение успешно отправлено в очередь");

                // Закрытие ресурсов
                producer.close();
                session.close();
                connection.close();

            } catch (JMSException e) {
                // Обработка исключений JMS
                LOGGER.log(Level.SEVERE, "Ошибка JMS", e);
                out.println("Ошибка при отправке сообщения: " + e.getMessage());
                throw new ServletException(e);
            }

        } catch (JMSException e) {
            // Ошибка создания соединения
            LOGGER.log(Level.SEVERE, "Ошибка соединения", e);
            response.sendError(
                HttpServletResponse.SC_INTERNAL_SERVER_ERROR, 
                "Не удалось установить JMS-соединение"
            );
        }
    }

    // Дополнительный метод для отправки сообщений программно
    public void sendMessage(String messageText) throws JMSException {
        Connection connection = connectionFactory.createConnection();
        try {
            Session session = connection.createSession(
                false, Session.AUTO_ACKNOWLEDGE
            );
            MessageProducer producer = session.createProducer(queue);
            TextMessage message = session.createTextMessage(messageText);
            producer.send(message);
        } finally {
            connection.close();
        }
    }
}

Основные особенности реализации:

  1. Внедрение ресурсов JMS:
  2. @Resource(lookup = "java:/ConnectionFactory")
  3. @Resource(lookup = "java:/jms/queue/ExampleQueue")

  4. Аннотация сервлета:

  5. @WebServlet("/producer") - доступ через URL /producer

  6. Обработка GET-запроса:

  7. Создание и отправка JMS-сообщения
  8. Логирование событий
  9. Обработка исключительных ситуаций

  10. Дополнительные возможности:

  11. Добавление заголовков сообщения
  12. Настройка режима доставки (постоянное хранение)
  13. Логирование через java.util.logging

  14. Бонус-метод sendMessage():

  15. Возможность отправки сообщений программно
  16. Полезен для backend-логики

Рекомендации по использованию:

  • Метод доступен через веб-браузер по URL /producer
  • Каждый вызов создает и отправляет новое сообщение
  • Сообщения сохраняются в очереди JMS

Что еще можно улучшить:

  • Добавить параметризацию сообщений
  • Реализовать REST-подобный интерфейс
  • Добавить расширенную обработку ошибок
  • Внедрить механизмы безопасности

Вопросы по реализации? Нужны ли какие-то дополнительные пояснения?