JBoss AS 7 простое приложение Hello World - PullRequest
1 голос
/ 19 декабря 2011

Я пытаюсь запустить простое приложение JMS "Hello world". Я хотел бы попробовать его на сервере приложений JBoss 7, но я не могу его запустить. Jboss, как HornetQ, внедрил его, и я запустил его, используя следующую команду:

standalone.bat --server-config=standalone-preview.xml

Я думаю, что проблема, скорее всего, связана с тем, как я настроил очередь в JBoss. Вот шаги, которые я сделал.

  • Настройка очереди

Quene name: testQueue Имя JNDI: очередь / тест

В конфигурации очереди есть опция «Селектор». Можно ли оставить это поле пустым, а если нет, что будет в этом поле?

  • Код

Вот код, который я использую в качестве Отправителя. Я пока не беспокоюсь о получателе, так как просто хочу сначала отправить сообщение.

package jms.ex3;

import javax.naming.InitialContext;

import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.QueueSender;
import javax.jms.DeliveryMode;
import javax.jms.QueueSession;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;

public class Sender
{
    public static void main(String[] args) throws Exception
    {
       // get the initial context
       InitialContext ctx = new InitialContext();

       // lookup the queue object
       Queue queue = (Queue) ctx.lookup("queue/test");

       // lookup the queue connection factory
       QueueConnectionFactory connFactory = (QueueConnectionFactory) ctx.
           lookup("queue/connectionFactory");

       // create a queue connection
       QueueConnection queueConn = connFactory.createQueueConnection();

       // create a queue session
       QueueSession queueSession = queueConn.createQueueSession(false,
           Session.DUPS_OK_ACKNOWLEDGE);

       // create a queue sender
       QueueSender queueSender = queueSession.createSender(queue);
       queueSender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

       // create a simple message to say "Hello"
       TextMessage message = queueSession.createTextMessage("Hello");

       // send the message
       queueSender.send(message);

       // print what we did
       System.out.println("sent: " + message.getText());

       // close the queue connection
       queueConn.close();
    }
}

Когда я запускаю вышеуказанный класс, я получаю следующую ошибку:

java -classpath C:\Users\702723344\Downloads\glassfish-3.1.1\glassfish3\glassfish\lib\javaee.jar;. jms.ex3.Sender
Exception in thread "main" javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
        at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
        at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
        at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
        at javax.naming.InitialContext.lookup(Unknown Source)
        at jms.ex3.Sender.main(Sender.java:22)

Как именно вышеприведенный класс узнает, что поставщик (JBoss) работает на компьютере локального хоста? Разве мне не нужно указывать где-нибудь IP-адрес? Есть идеи?

Редактировать

Большая часть документации относится к JBoss AS 6. Я обновил фрагмент кода, добавив следующее:

Properties env = new Properties();
    env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory" );
    env.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
    env.put(Context.PROVIDER_URL, "jnp://localhost:1199");
    ctx = new InitialContext(env);

Теперь я получаю исключение classNotFound. Я думаю, что для добавления в classpath требуется дополнительный jar-файл, но какой ???

java -classpath C:\Users\702723344\Downloads\glassfish-3.1.1\glassfish3\glassfish\lib\javaee.jar;. jms.ex3.Sender
    Exception in thread "main" javax.naming.NoInitialContextException: Cannot instantiate class: org.jnp.interfaces.NamingContextFactory [Root exception is java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory]
            at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
            at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
            at javax.naming.InitialContext.init(Unknown Source)
            at javax.naming.InitialContext.<init>(Unknown Source)
            at jms.ex3.Sender.main(Sender.java:27)
    Caused by: java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory
            at java.net.URLClassLoader$1.run(Unknown Source)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(Unknown Source)
            at java.lang.ClassLoader.loadClass(Unknown Source)
            at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
            at java.lang.ClassLoader.loadClass(Unknown Source)
            at java.lang.Class.forName0(Native Method)
            at java.lang.Class.forName(Unknown Source)
            at com.sun.naming.internal.VersionHelper12.loadClass(Unknown Source)
            ... 5 more

Ответы [ 2 ]

5 голосов
/ 19 декабря 2011

Ответ на ClassNotFoundException.

org.jnp.interfaces.NamingContextFactory может быть расположен в jboss-as-7.0.0.Final\modules\org\jboss\as\naming\main\jboss-as-naming-7.0.0.Final.jar.

Также заметил glassfish \ lib \ javaee.jar в вашем classpath и хотел дать совет о том, как легко включить в classpath несколько jar из папки jboss / client.Но, впрочем, в JBoss AS 7.0 такой папки нет.

Похоже, что JBoss AS 7.0 вообще не поддерживает удаленных клиентов (по крайней мере, для EJB).Посмотрите на эту ветку: http://community.jboss.org/message/613171. Это очень интересно.

Существует вероятность того, что вы получите дополнительные ClassCastException с использованием glassfish \ lib \ javaee.jar.

0 голосов
/ 27 августа 2014

Я не согласен с последним ответом от Вадима

Я знаю, что отвечаю на очень старый вопрос, но эта информация не давала мне покоя в течение дня. Это был первый раз, когда я пытался настроить JMSудаленная очередь на JBOSS 7, поэтому пришлось ответить, что заставило меня работать.

Похоже, что JBoss AS 7.0 вообще не поддерживает удаленных клиентов (по крайней мере, для EJB) ... ??

Можно вызвать удаленную очередь.ниже приведены следующие шаги ..

  1. Обязательно добавьте очереди в standalone.xml или (full.xml), ниже я настроил myRemoteStatusQueue, если вы заметили, экспортировалпараметр должен, чтобы jboss знал, что он будет использован внешним клиентом jms

    <jms-destinations>
        <jms-queue name="testQueue">
            <entry name="queue/test"/>
            <entry name="java:jboss/exported/jms/queue/test"/>
        </jms-queue>
        <jms-queue name="ddsStatusQueue">
            <entry name="java:jboss/exported/jms/queue/myRemoteStatusQueue"/><!--Exported key necessary -->
        </jms-queue>
        <jms-topic name="testTopic">
            <entry name="topic/test"/>
            <entry name="java:jboss/exported/jms/topic/test"/>
        </jms-topic>
    </jms-destinations>
    
  2. Обязательно добавьте роль пользователю приложения: например, remote-role, последобавляя роль, убедитесь, что включили их в standalone.xml Jboss.

    <jms-destinations>
        <jms-queue name="testQueue">
            <entry name="queue/test"/>
            <entry name="java:jboss/exported/jms/queue/test"/>
        </jms-queue>
        <jms-queue name="ddsStatusQueue">
            <entry name="java:jboss/exported/jms/queue/myRemoteStatusQueue"/>   <!--Exported key necessary -->
        </jms-queue>
        <jms-topic name="testTopic">
            <entry name="topic/test"/>
            <entry name="java:jboss/exported/jms/topic/test"/>
        </jms-topic>
    </jms-destinations>
    <security-settings>
        <security-setting match="#">
            <permission type="send" roles="remote-role guest"/>
            <permission type="consume" roles="remote-role guest"/>
            <permission type="createNonDurableQueue" roles="guest"/>
            <permission type="deleteNonDurableQueue" roles="guest"/>
        </security-setting>
    </security-settings>
    
  3. Убедитесь, что вы используете приведенный ниже код, вы можете видеть, что я использовал remote: / как часть URLдля удаленного взаимодействия

    private static final String DEFAULT_MESSAGE = " Dummy message local Client Message At"+new Date();
    private static final String DEFAULT_CONNECTION_FACTORY = "/jms/ConnectionFactory";
    private static final String DEFAULT_DESTINATION = "jms/queue/myRemoteStatusQueue";
    private static final String DEFAULT_MESSAGE_COUNT = "1";
    private static final String DEFAULT_USERNAME = "abhijith";
    private static final String DEFAULT_PASSWORD = "password";
    private static final String INITIAL_CONTEXT_FACTORY = "org.jboss.naming.remote.client.InitialContextFactory";
    private static final String PROVIDER_URL = "remote://localhost:4447";
    
  4. Убедитесь, что вы используете правильные jar-файлы. В приведенном выше примере я использовал hornetq-core-2.2.14.Final.jar и использование правильного jar-клиента JBOSS, перейдите в папку clientкаталог bin JBOSS, у вас будет readme.txt, там у вас будет ссылка на версию Maven для использования, если вы используете в качестве автономного приложения, то вы можете ссылаться на данный jar в каталоге.

  5. Развернуть приложение on JBOSS, во время запуска вы должны увидеть настроенную очередь без каких-либо ошибок.Например, вы можете увидеть в журнале запуска моего сервера java:jboss/exported/jms/queue/myRemoteStatusQueue.Если в приведенной выше записи возникла ошибка, теперь вы можете идти ...

    16:24:46,527 INFO  [org.jboss.as.messaging] (MSC service thread 1-2) JBAS011601: Bound messaging object to jndi name java:/queue/test
    16:24:46,533 INFO  [org.jboss.as.messaging] (MSC service thread 1-2) JBAS011601: Bound messaging object to jndi name java:jboss/exported/jms/queue/test
    16:24:46,545 INFO  [org.jboss.as.messaging] (MSC service thread 1-8) JBAS011601: Bound messaging object to jndi name java:jboss/exported/jms/RemoteConnectionFactory
    16:24:46,548 INFO  [org.jboss.as.messaging] (MSC service thread 1-8) JBAS011601: Bound messaging object to jndi name java:/RemoteConnectionFactory
    16:24:46,551 INFO  [org.jboss.as.messaging] (MSC service thread 1-3) JBAS011601: Bound messaging object to jndi name java:/ConnectionFactory
    16:24:46,552 INFO  [org.hornetq.core.server.impl.HornetQServerImpl] (MSC service thread 1-4) trying to deploy queue jms.topic.testTopic
    16:24:46,569 INFO  [org.jboss.as.deployment.connector] (MSC service thread 1-6) JBAS010406: Registered connection factory java:/JmsXA
    16:24:46,607 INFO  [org.hornetq.ra.HornetQResourceAdapter] (MSC service thread 1-6) HornetQ resource adaptor started
    16:24:46,609 INFO  [org.jboss.as.connector.services.ResourceAdapterActivatorService$ResourceAdapterActivator] (MSC service thread 1-6) IJ020002: Deployed: file://RaActivatorhornetq-ra
    16:24:46,612 INFO  [org.jboss.as.deployment.connector] (MSC service thread 1-6) JBAS010401: Bound JCA ConnectionFactory [java:/JmsXA]
    16:24:46,638 INFO  [org.jboss.as.messaging] (MSC service thread 1-4) JBAS011601: Bound messaging object to jndi name java:/topic/test
    16:24:46,641 INFO  [org.jboss.as.messaging] (MSC service thread 1-4) JBAS011601: Bound messaging object to jndi name java:jboss/exported/jms/topic/test
    16:24:46,642 INFO  [org.hornetq.core.server.impl.HornetQServerImpl] (MSC service thread 1-7) trying to deploy queue jms.queue.myRemoteStatusQueue
    16:24:46,645 INFO  [org.jboss.as.messaging] (MSC service thread 1-7) JBAS011601: Bound messaging object to jndi name java:jboss/exported/jms/queue/myRemoteStatusQueue
    16:24:47,211 INFO  [org.jboss.ws.common.management.AbstractServerConfig] (MSC service thread 1-1) JBoss Web Services - Stack CXF Server 4.0.2.GA
    (-1 / -1) (org/jboss/as/network/ManagedBinding$Factory/org/jboss/as/network/ManagedBinding$Factory)
    

Счастливого кодирования,

С уважением, Абхиджит

...