JBoss AS 7简单的hello world应用程序

zig*_*ggy 1 jboss jndi jms message-queue hornetq

我试图让一个简单的JMS"Hello world"应用程序运行.我想在JBoss Application Server 7上试一试,但我无法运行它.作为HornetQ的Jboss嵌入其中,我使用以下命令启动它:

standalone.bat --server-config=standalone-preview.xml
Run Code Online (Sandbox Code Playgroud)

我认为问题很可能是我在JBoss中配置队列的方式.这是我做的步骤.

  • 配置队列

Quene名称:testQueue JNDI名称:queue/test

队列配置有一个"选择器"选项.这可以留空,如果没有,这个领域会发生什么?

这是我用作发件人的代码.我现在不担心接收器,因为我只想先开始发送消息.

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行上面的类时,我收到以下错误:

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)
Run Code Online (Sandbox Code Playgroud)

上面的类究竟知道Provider(JBoss)是否在localhost机器上运行?我不需要在某处指定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);
Run Code Online (Sandbox Code Playgroud)

我现在得到classNotFound异常.我认为它需要一个额外的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
Run Code Online (Sandbox Code Playgroud)

Vad*_*zim 5

回答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,并想提供一个如何 jboss/client文件夹中轻松包含在classpath多个jar中的建议.但是oups - JBoss AS 7.0中没有这样的文件夹.

似乎JBoss AS 7.0根本不支持远程客户端(至少对于EJB).看看这个帖子:http://community.jboss.org/message/613171.这很有趣.

使用glassfish\lib\javaee.jar有可能进一步获得一些ClassCastExceptions.