Я подготовлю подробный пошаговый пример настройки и работы с JMS в среде Linux с использованием WildFly, Maven и JDK 17.
Пошаговое руководство по настройке JMS
Шаг 1: Подготовка проекта
- Создание структуры Maven-проекта:
mkdir jms-demo
cd jms-demo
mkdir -p src/main/java/com/example/jms
mkdir -p src/main/resources
- Создание
pom.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>jms-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jakarta.jakartaee-api.version>10.0.0</jakarta.jakartaee-api.version>
</properties>
<dependencies>
<!-- Jakarta EE API -->
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version>${jakarta.jakartaee-api.version}</version>
<scope>provided</scope>
</dependency>
<!-- JMS API -->
<dependency>
<groupId>jakarta.jms</groupId>
<artifactId>jakarta.jms-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>jms-demo</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Шаг 2: Настройка WildFly для JMS
- Откройте конфигурационный файл WildFy:
nano $WILDFLY_HOME/standalone/configuration/standalone-full.xml
- Убедитесь, что активирован профиль full, который включает messaging подсистему.
Шаг 3: Создание JMS ресурсов
Создадим MessageQueue и ConnectionFactory в WildFly:
- Запустите CLI WildFly:
$WILDFLY_HOME/bin/jboss-cli.sh
- Выполните команды:
Эта ошибка означает, что нужно предварительно настроить socket-binding.
Сначала добавьте socket-binding:
[standalone@localhost:9990 /] /socket-binding-group=standard-sockets/socket-binding=messaging-remote:add(port=61616,interface=public)
Затем создайте remote-connector:
[standalone@localhost:9990 /] /subsystem=messaging-activemq/server=default/remote-connector=remote-connector:add(socket-binding=messaging-remote)
Создайте connection factory:
[standalone@localhost:9990 /] /subsystem=messaging-activemq/server=default/connection-factory=ExampleConnectionFactory:add(entries=["java:/ConnectionFactory"], connectors=["remote-connector"])
Если возникнут проблемы, выполните:
[standalone@localhost:9990 /] /socket-binding-group=standard-sockets:read-resource(recursive=true)
Это покажет текущую конфигурацию socket-binding.
Какой результат после выполнения этих команд?
Подскажите, какие действия уже были предприняты и что именно не работает.
connect
/subsystem=messaging-activemq/server=default/jms-queue=ExampleQueue:add(entries=["java:/jms/queue/ExampleQueue"])
# Использовать другое имя для entries
/subsystem=messaging-activemq/server=default/connection-factory=ExampleConnectionFactory:add(entries=["java:jboss/exported/ConnectionFactory"], connectors=["remote-connector"])
:reload
Шаг 4: Создание JMS Producer
<antArtifact identifier="jms-producer" type="application/vnd.ant.code" language="java" title="JMS Producer">
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;
@WebServlet("/producer")
public class JMSProducer extends HttpServlet {
@Resource(lookup = "java:/ConnectionFactory")
private ConnectionFactory connectionFactory;
@Resource(lookup = "java:/jms/queue/ExampleQueue")
private Queue queue;
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/plain");
PrintWriter out = response.getWriter();
try (Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(
false, Session.AUTO_ACKNOWLEDGE)) {
MessageProducer producer = session.createProducer(queue);
TextMessage message = session.createTextMessage(
"Привет от JMS! Время: " + System.currentTimeMillis());
producer.send(message);
out.println("Сообщение отправлено: " + message.getText());
} catch (JMSException e) {
throw new ServletException(e);
}
}
}
Шаг 5: Создание JMS Consumer
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;
@WebServlet("/consumer")
public class JMSConsumer extends HttpServlet {
@Resource(lookup = "java:/ConnectionFactory")
private ConnectionFactory connectionFactory;
@Resource(lookup = "java:/jms/queue/ExampleQueue")
private Queue queue;
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/plain");
PrintWriter out = response.getWriter();
try (Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(
false, Session.AUTO_ACKNOWLEDGE)) {
connection.start();
MessageConsumer consumer = session.createConsumer(queue);
Message message = consumer.receive(5000); // Ожидание 5 секунд
if (message instanceof TextMessage textMessage) {
out.println("Получено сообщение: " +
textMessage.getText());
} else {
out.println("Сообщений нет");
}
} catch (JMSException e) {
throw new ServletException(e);
}
}
}
Шаг 6: Создание дескриптора развертывания
Создайте src/main/webapp/WEB-INF/web.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
version="6.0">
<display-name>JMS Demo Application</display-name>
</web-app>
Шаг 7: Сборка и развертывание
- Соберите проект:
mvn clean package
- Скопируйте war-файл в развертывания WildFly:
cp target/jms-demo.war $WILDFLY_HOME/standalone/deployments/
Шаг 8: Запуск WildFly
- Запустите сервер:
$WILDFLY_HOME/bin/standalone.sh -c standalone-full.xml
Проверка работы
- Откройте в браузере:
http://localhost:8080/jms-demo/producer
- отправка сообщенияhttp://localhost:8080/jms-demo/consumer
- получение сообщения
Советы и рекомендации
- Всегда используйте полнопрофильную конфигурацию WildFly
- Настройте механизмы безопасности
- Обрабатывайте исключения JMS
- Используйте транзакционность при необходимости
Возможные проблемы
- Убедитесь, что messaging-activemq включен
- Проверьте права доступа к очередям
- Корректность JNDI-имён
Дополнительная настройка
Для продакшена рекомендуется: - Настроить постоянное хранение сообщений - Установить ограничения на размер очереди - Реализовать обработку ошибок - Добавить мониторинг производительности
Вопросы? Нужны уточнения по какому-либо шагу?