Как настроить JMS в JBoss EAP 7?

Я устал искать в гугле и получил вот это. Эти ссылки относятся к jboss eap 6.

1.Как настроить JMS в jboss eap 7?

2. Есть ли у Jboss eap 7 встроенный JMS? или нужно настроить вручную?

3. пример приложения с использованием Jboss eap 7?


person Sangram Badi    schedule 13.10.2016    source источник


Ответы (2)


После долгих мучений я получил ответ.

В JBoss сервер EAP 7 поддерживает Apache ActiveMQ Artemis. которые встроены в сервер JBoss EAP 7, но некоторые загруженные серверы JBoss EAP 7 могут не содержать Apache ActiveMQ Artemis, из-за чего вы можете не найти Messaging-ActiveMQ в подсистеме jboss. Для этого вам необходимо настроить вручную в файле standalone.xml. Ниже следуйте инструкциям по настройке.

Шаг 1

Запустите сервер JBoss EAP 7

шаг 2

• Запустите файл add-user.bat с компакт-диска /PATH/TO/JBoss-EAP-7.0/bin.

• Для Linux-сервера необходимо выполнить команду ./add-user.sh. После запуска появится cmd.

тогда появится cmd. здесь вам нужно добавить нового пользователя приложения. Пусть ваш:

имя пользователя: jmsuser, пароль: jmsuser@123, роль пользователя: guest

What type of user do you wish to add? 
 a) Management User (mgmt-users.properties) 
 b) Application User (application-users.properties)
(a): b

Enter the details of the new user to add.
Using realm 'ApplicationRealm' as discovered from the existing property files.
Username : jmsuser
User 'jmsuser' already exists and is enabled, would you like to... 
 a) Update the existing user password and roles 
 b) Disable the existing user 
 c) Type a new username
(a): a
Password recommendations are listed below. To modify these restrictions edit the add-user.properties configuration file.
 - The password should be different from the username
 - The password should not be one of the following restricted values {root, admin, administrator}
 - The password should contain at least 8 characters, 1 alphabetic character(s), 1 digit(s), 1 non-alphanumeric symbol(s)
Password : 
Re-enter Password : 
What groups do you want this user to belong to? (Please enter a comma separated list, or leave blank for none)[guest]: guest
Updated user 'jmsuser' to file '/Users/jsensharma/NotBackedUp/Installed/wildfly-10.0.0.CR3-SNAPSHOT/standalone/configuration/application-users.properties'
Updated user 'jmsuser' to file '/Users/jsensharma/NotBackedUp/Installed/wildfly-10.0.0.CR3-SNAPSHOT/domain/configuration/application-users.properties'
Updated user 'jmsuser' with groups guest to file '/Users/jsensharma/NotBackedUp/Installed/wildfly-10.0.0.CR3-SNAPSHOT/standalone/configuration/application-roles.properties'
Updated user 'jmsuser' with groups guest to file '/Users/jsensharma/NotBackedUp/Installed/wildfly-10.0.0.CR3-SNAPSHOT/domain/configuration/application-roles.properties'
Is this new user going to be used for one AS process to connect to another AS process? 
e.g. for a slave host controller connecting to the master or for a Remoting connection for server to server EJB calls.
yes/no? yes
To represent the user add the following to the server-identities definition <secret value="am1zdXNlckAxMjM=" />

Setp-3 Создание простой очереди JMS с помощью утилиты командной строки JBoss CLI. ПРИМЕЧАНИЕ. Имя JNDI должно содержать префикс «java:/jboss/exported», иначе очередь JMS не может быть просмотрена удаленно. пусть здесь имя вашей очереди TestQ

$ cd /PATH/TO/JBoss-eap-7.0/bin
$ ./jboss-cli.sh -c

[standalone@localhost:9990 /] /subsystem=messaging-activemq/server=default/jms-queue=TestQ/:add(entries=["java:/jboss/exported/jms/queue/TestQ"])
  {"outcome" => "success"}

[standalone@localhost:9990 /] :reload
  {
    "outcome" => "success",
    "result" => undefined
  }

шаг 4 теперь проверьте свой файл standalone.xml, сгенерирован ли приведенный ниже код xml или нет, если он не сгенерирован, скопируйте приведенный ниже код и вставьте его.

<subsystem xmlns="urn:jboss:domain:messaging-activemq:1.0">
    <server name="default">
        <security-setting name="#">
            <role name="guest" delete-non-durable-queue="true" create-non-durable-queue="true" consume="true" send="true"/>
        </security-setting>
        <address-setting name="#" message-counter-history-day-limit="10" page-size-bytes="2097152" max-size-bytes="10485760" expiry-address="jms.queue.ExpiryQueue" dead-letter-address="jms.queue.DLQ"/>
        <http-connector name="http-connector" endpoint="http-acceptor" socket-binding="http"/>
        <http-connector name="http-connector-throughput" endpoint="http-acceptor-throughput" socket-binding="http">
            <param name="batch-delay" value="50"/>
        </http-connector>
        <in-vm-connector name="in-vm" server-id="0"/>
        <http-acceptor name="http-acceptor" http-listener="default"/>
        <http-acceptor name="http-acceptor-throughput" http-listener="default">
            <param name="batch-delay" value="50"/>
            <param name="direct-deliver" value="false"/>
        </http-acceptor>
        <in-vm-acceptor name="in-vm" server-id="0"/>
        <jms-queue name="ExpiryQueue" entries="java:/jms/queue/ExpiryQueue"/>
        <jms-queue name="DLQ" entries="java:/jms/queue/DLQ"/>

        <!-- Newly added JMS Queue is Here -->
        <jms-queue name="TestQ" entries="java:/jboss/exported/jms/queue/TestQ"/>

        <connection-factory name="InVmConnectionFactory" entries="java:/ConnectionFactory" connectors="in-vm"/>
        <connection-factory name="RemoteConnectionFactory" entries="java:jboss/exported/jms/RemoteConnectionFactory" connectors="http-connector"/>
        <pooled-connection-factory name="activemq-ra" transaction="xa" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory" connectors="in-vm"/>
    </server>
</subsystem>

Примечание. Если файл standalone.xml не содержит тега <extension module="org.wildfly.extension.messaging-activemq"/> внутри тега <extensions>, вам необходимо добавить его вручную в файл standalone.xml введите здесь описание изображения

Шаг 5. Теперь попробуйте получить доступ к консоли администратора, чтобы проверить, добавлена ​​ли очередь. URL-адрес — http://localhost:9990/console/App.html введите здесь описание изображения

Конфигурация выполнена.

Как получить доступ к JMS с помощью JAVA

Банки для обычной автономной программы

введите описание изображения здесь

ИЛИ

Зависимость для проекта maven pom.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.jboss.quickstarts.eap</groupId>
    <artifactId>jboss-helloworld-jms</artifactId>
    <version>7.0.0.GA</version>
    <packaging>jar</packaging>
    <name>JBoss EAP Quickstart: helloworld-jms</name>
    <description>helloworld-jms: Helloworld JMS external producer/consumer client</description>
    <url>http://www.jboss.org/products/eap</url>

    <licenses>
        <license>
            <name>Apache License, Version 2.0</name>
            <distribution>repo</distribution>
            <url>http://www.apache.org/licenses/LICENSE-2.0.html</url>
        </license>
    </licenses>

    <!-- Activate JBoss Product Maven repository.

        NOTE: Configuring the Maven repository in the pom.xml file is not a recommended procedure
        and is only done here to make it easier to use the quickstarts.

        For more information about how to configure Maven for your application,
        see the section entitled 'Use the Maven Repository'
        in the Development Guide for Red Hat JBoss Enterprise Application Platform located here:

        https://access.redhat.com/documentation/en/jboss-enterprise-application-platform/
    -->
    <repositories>
        <repository>
            <id>jboss-enterprise-maven-repository</id>
            <url>https://maven.repository.redhat.com/ga/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>jboss-enterprise-maven-repository</id>
            <url>https://maven.repository.redhat.com/ga/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>

    <properties>
        <!-- Explicitly declaring the source encoding eliminates the following message: -->
        <!-- [WARNING] Using platform encoding (UTF-8 actually) to copy filtered
            resources, i.e. build is platform dependent! -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <!-- EAP component version management BOM -->
        <version.jboss.bom.eap>7.0.0.GA</version.jboss.bom.eap>

        <!-- WildFly Maven plug-in to deploy your WAR to a local JBoss EAP container -->
        <version.wildfly.maven.plugin>1.0.2.Final</version.wildfly.maven.plugin>

        <!-- other plug-in versions -->
        <version.jar.plugin>2.2</version.jar.plugin>
        <version.exec.plugin>1.2.1</version.exec.plugin>

        <!-- maven-compiler-plugin -->
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.source>1.8</maven.compiler.source>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- JBoss distributes a complete set of Java EE APIs including a Bill
                of Materials (BOM). A BOM specifies the versions of a "stack" (or a collection)
                of artifacts. We use this here so that we always get the correct versions
                of artifacts. Here we use the jboss-eap-javaee7 stack (you can
                read this as the JBoss stack of the Java EE APIs and related components.  -->
            <dependency>
                <groupId>org.jboss.bom</groupId>
                <artifactId>jboss-eap-javaee7</artifactId>
                <version>${version.jboss.bom.eap}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.jboss.eap</groupId>
            <artifactId>wildfly-jms-client-bom</artifactId>
            <type>pom</type>
        </dependency>
    </dependencies>

    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>${version.exec.plugin}</version>
                <configuration>
                    <mainClass>org.jboss.as.quickstarts.jms.HelloWorldJMSClient1</mainClass>
                    <systemProperties>
                        <systemProperty>
                            <key>java.logging.config.file</key>
                            <value>./helloworld-jms-logging.properties</value>
                        </systemProperty>
                    </systemProperties>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-jar-plugin</artifactId>
                <version>${version.jar.plugin}</version>
                <configuration>
                </configuration>
            </plugin>
            <!-- WildFly plug-in to deploy the WAR -->
            <plugin>
                <groupId>org.wildfly.plugins</groupId>
                <artifactId>wildfly-maven-plugin</artifactId>
                <version>${version.wildfly.maven.plugin}</version>
            </plugin>
        </plugins>
    </build>
</project>

HelloWorldJMSProducer.java

import java.util.Properties;
import java.util.logging.Logger;

import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSContext;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class HelloWorldJMSProducer{

    private static final Logger log = Logger.getLogger(HelloWorldJMSProducer.class.getName());

    // Set up all the default values
    private static final String DEFAULT_MESSAGE = "Hello, World! successfull";
    private static final String DEFAULT_CONNECTION_FACTORY = "jms/RemoteConnectionFactory";
    private static final String DEFAULT_DESTINATION = "jms/queue/TestQ";
    private static final String DEFAULT_MESSAGE_COUNT = "1";
    private static final String DEFAULT_USERNAME = "jmsuser";
    private static final String DEFAULT_PASSWORD = "jmsuser@123";
    private static final String INITIAL_CONTEXT_FACTORY = "org.jboss.naming.remote.client.InitialContextFactory";
    private static final String PROVIDER_URL = "http-remoting://127.0.0.1:8888";

    public static void main(String[] args) {

        Context namingContext = null;

        try {
            String userName = System.getProperty("username", DEFAULT_USERNAME);
            String password = System.getProperty("password", DEFAULT_PASSWORD);

            // Set up the namingContext for the JNDI lookup
            final Properties env = new Properties();
            env.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);
            env.put(Context.PROVIDER_URL, System.getProperty(Context.PROVIDER_URL, PROVIDER_URL));
            env.put(Context.SECURITY_PRINCIPAL, userName);
            env.put(Context.SECURITY_CREDENTIALS, password);
            namingContext = new InitialContext(env);

            // Perform the JNDI lookups
            String connectionFactoryString = System.getProperty("connection.factory", DEFAULT_CONNECTION_FACTORY);
            ConnectionFactory connectionFactory = (ConnectionFactory) namingContext.lookup(connectionFactoryString);

            String destinationString = System.getProperty("destination", DEFAULT_DESTINATION);
            Destination destination = (Destination) namingContext.lookup(destinationString);

            int count = Integer.parseInt(System.getProperty("message.count", DEFAULT_MESSAGE_COUNT));
            String content = System.getProperty("message.content", DEFAULT_MESSAGE);

            try (JMSContext context = connectionFactory.createContext(userName, password)) {
                // Send the specified number of messages
                for (int i = 0; i < count; i++) {
                    context.createProducer().send(destination, content);
                }

                System.out.println("Sent...");
            }
        } catch (NamingException e) {
            e.printStackTrace();
            log.severe(e.getMessage());
        } finally {
            if (namingContext != null) {
                try {
                    namingContext.close();
                } catch (NamingException e) {
                    log.severe(e.getMessage());
                }
            }
        }
    }
}

HelloWorldJMSConsumer.java

import java.util.Properties;
import java.util.logging.Logger;

import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSConsumer;
import javax.jms.JMSContext;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class HelloWorldJMSConsumer {

    private static final Logger log = Logger.getLogger(HelloWorldJMSConsumer.class.getName());

    // Set up all the default values
    private static final String DEFAULT_CONNECTION_FACTORY = "jms/RemoteConnectionFactory";
    private static final String DEFAULT_DESTINATION = "jms/queue/TestQ";
    private static final String DEFAULT_USERNAME = "jmsuser";
    private static final String DEFAULT_PASSWORD = "jmsuser@123";
    private static final String INITIAL_CONTEXT_FACTORY = "org.jboss.naming.remote.client.InitialContextFactory";
    private static final String PROVIDER_URL = "http-remoting://127.0.0.1:8888";

    public static void main(String[] args) {

        Context namingContext = null;

        try {
            String userName = System.getProperty("username", DEFAULT_USERNAME);
            String password = System.getProperty("password", DEFAULT_PASSWORD);

            // Set up the namingContext for the JNDI lookup
            final Properties env = new Properties();
            env.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);
            env.put(Context.PROVIDER_URL, System.getProperty(Context.PROVIDER_URL, PROVIDER_URL));
            env.put(Context.SECURITY_PRINCIPAL, userName);
            env.put(Context.SECURITY_CREDENTIALS, password);
            namingContext = new InitialContext(env);

            // Perform the JNDI lookups
            String connectionFactoryString = System.getProperty("connection.factory", DEFAULT_CONNECTION_FACTORY);
            ConnectionFactory connectionFactory = (ConnectionFactory) namingContext.lookup(connectionFactoryString);

            String destinationString = System.getProperty("destination", DEFAULT_DESTINATION);
            Destination destination = (Destination) namingContext.lookup(destinationString);

            try (JMSContext context = connectionFactory.createContext(userName, password)) {
                System.out.println("Received...");
                // Create the JMS consumer
                JMSConsumer consumer = context.createConsumer(destination);
                // Then receive the same number of messages that were sent
                for (int i = 0; i < count; i++) {
                    String text = consumer.receiveBody(String.class, 5000);
                    System.out.println(text);
                }

            }
        } catch (NamingException e) {
            e.printStackTrace();
            log.severe(e.getMessage());
        } finally {
            if (namingContext != null) {
                try {
                    namingContext.close();
                } catch (NamingException e) {
                    log.severe(e.getMessage());
                }
            }
        }
    }
}
person Sangram Badi    schedule 21.12.2016
comment
Хороший друг ... Отличная работа - person Rajesh; 21.11.2017
comment
У меня есть один короткий вопрос, у меня есть опыт работы с сервером приложений Websphere, и в WAS мы используем разные номера портов для связи JMS, относится ли это также и к серверу JBoss? Можем ли мы настроить этот номер порта? - person Rajesh; 23.11.2017
comment
извините, у меня нет знаний об этом - person Sangram Badi; 24.11.2017
comment
Хороший ответ, глупо закрываться как слишком широкий. Мне не нужен был ваш ответ, но жаль, что я не нашел его вчера, когда я столкнулся со всеми теми же проблемами, что и вы, лол, поэтому я думаю, что это хорошо, поскольку я считаю, что он охватывает все, что я делал. Однако я решил использовать standalone-full.xml, чтобы упростить задачу. - person JGlass; 08.02.2018
comment
@JGlass, ты пропустил это :) - person Sangram Badi; 28.05.2018
comment
@SangramBadi, если у меня уже есть очередь обмена сообщениями в jboss eap. как я могу добавить очередь и как настроить в консоли администратора jboss? - person Akhil S Kamath; 14.06.2018
comment
Разве мы не можем просто использовать standalone-full.xml, в котором все это уже есть? Пожалуйста, посмотрите это видео. youtube.com/watch?v=4XwVjX_Q33Y Я нашел это полезным - person Reddymails; 02.11.2018