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();
}
}
}
Основные особенности реализации:
- Внедрение ресурсов JMS:
@Resource(lookup = "java:/ConnectionFactory")
-
@Resource(lookup = "java:/jms/queue/ExampleQueue")
-
Аннотация сервлета:
-
@WebServlet("/producer")
- доступ через URL/producer
-
Обработка GET-запроса:
- Создание и отправка JMS-сообщения
- Логирование событий
-
Обработка исключительных ситуаций
-
Дополнительные возможности:
- Добавление заголовков сообщения
- Настройка режима доставки (постоянное хранение)
-
Логирование через
java.util.logging
-
Бонус-метод
sendMessage()
: - Возможность отправки сообщений программно
- Полезен для backend-логики
Рекомендации по использованию:
- Метод доступен через веб-браузер по URL
/producer
- Каждый вызов создает и отправляет новое сообщение
- Сообщения сохраняются в очереди JMS
Что еще можно улучшить:
- Добавить параметризацию сообщений
- Реализовать REST-подобный интерфейс
- Добавить расширенную обработку ошибок
- Внедрить механизмы безопасности
Вопросы по реализации? Нужны ли какие-то дополнительные пояснения?