1

我正在尝试运行一个简单的 JMS“Hello world”应用程序。我想在 JBoss Application Server 7 上试用它,但我无法运行它。Jboss as HornetQ 嵌入其中,我使用以下命令启动它:

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

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

  • 配置队列

队列名称: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)

上面的类究竟是如何知道 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);

我现在收到 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
4

2 回答 2

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 文件夹的多个 jar提供建议。但是 oups - JBoss AS 7.0 中没有这样的文件夹。

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

通过使用 glassfish\lib\javaee.jar,您有可能进一步得到一些 ClassCastExceptions。

于 2011-12-19T17:42:10.040 回答
0

我不同意 Vadzim 的最后回答

我知道我正在回答一个非常古老的问题,但是这个信息让我错过了一天,这是我第一次尝试在 JBOSS 7 上设置 JMS 远程队列,因此不得不回答,这让我开始工作。

看来 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,添加角色后确保将它们包含在 Jboss 的standalone.xml 中。

    <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了正确的JBOSS客户端jar,进入JBOSS的bin目录的client文件夹,你会有readme.txt,那里你会有Maven版本的参考使用,如果您作为独立应用程序使用,则可以在目录中引用给定的 jar。

  5. 在 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)
    

快乐编码,

问候, 阿比吉斯

于 2014-08-27T16:39:48.777 回答