Skip to content

Я подготовлю подробный пошаговый пример настройки и работы с JMS в среде Linux с использованием WildFly, Maven и JDK 17.

Пошаговое руководство по настройке JMS

Шаг 1: Подготовка проекта

  1. Создание структуры Maven-проекта:
mkdir jms-demo
cd jms-demo
mkdir -p src/main/java/com/example/jms
mkdir -p src/main/resources
  1. Создание 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

  1. Откройте конфигурационный файл WildFy:
nano $WILDFLY_HOME/standalone/configuration/standalone-full.xml
  1. Убедитесь, что активирован профиль full, который включает messaging подсистему.

Шаг 3: Создание JMS ресурсов

Создадим MessageQueue и ConnectionFactory в WildFly:

  1. Запустите CLI WildFly:
$WILDFLY_HOME/bin/jboss-cli.sh
  1. Выполните команды:

Эта ошибка означает, что нужно предварительно настроить 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: Сборка и развертывание

  1. Соберите проект:
mvn clean package
  1. Скопируйте war-файл в развертывания WildFly:
cp target/jms-demo.war $WILDFLY_HOME/standalone/deployments/

Шаг 8: Запуск WildFly

  1. Запустите сервер:
$WILDFLY_HOME/bin/standalone.sh -c standalone-full.xml

Проверка работы

  1. Откройте в браузере:
  2. http://localhost:8080/jms-demo/producer - отправка сообщения
  3. http://localhost:8080/jms-demo/consumer - получение сообщения

Советы и рекомендации

  1. Всегда используйте полнопрофильную конфигурацию WildFly
  2. Настройте механизмы безопасности
  3. Обрабатывайте исключения JMS
  4. Используйте транзакционность при необходимости

Возможные проблемы

  • Убедитесь, что messaging-activemq включен
  • Проверьте права доступа к очередям
  • Корректность JNDI-имён

Дополнительная настройка

Для продакшена рекомендуется: - Настроить постоянное хранение сообщений - Установить ограничения на размер очереди - Реализовать обработку ошибок - Добавить мониторинг производительности

Вопросы? Нужны уточнения по какому-либо шагу?