【问题标题】:Running HornetQ as standalone server example运行 HornetQ 作为独立服务器示例
【发布时间】:2023-03-17 21:00:01
【问题描述】:

目前我正在努力学习 HornetQ。从理论上讲,事情似乎很简单,但即使是最基本的示例,我也很难运行。

到目前为止,我已经尝试将 HornetQ 作为独立服务器启动,并连接一个发送消息然后接收回来的简单客户端。

我遵循的步骤是: (根据 HornetQ 文档 http://hornetq.sourceforge.net/docs/hornetq-2.0.0.GA/user-manual/en/html/using-jms.html)

-下载最新版本的HornetQ (2.2.5) 并解压。 -修改了INSTALL_DIRECTORY\config\stand-alone\non-clustered\hornetq-jms.xml文件来创建我需要的对象,下面是内容:

<configuration xmlns="urn:hornetq"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="urn:hornetq ../schemas/hornetq-jms.xsd ">
        <connection-factory name="ConnectionFactory">
            <connectors>
                <connector-ref connector-name="netty"/>
            </connectors>
            <entries>
                <entry name="ConnectionFactory"/>
            </entries>
        </connection-factory>

        <queue name="OrderQueue">
            <entry name="queues/OrderQueue"/>
        </queue>
</configuration>

-文件 INSTALL_DIRECTORY\config\stand-alone\non-clustered\hornetq-beans.xml 包含启动 JNDI 服务所需的 bean。

-在INSTALL_DIRECTORY\config\stand-alone\non-clustered\文件夹下还有一个叫jndi.properties的文件

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=jnp://localhost:1099
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces

客户端代码如下:

public void test()
    {
        try
        {
            ic = new InitialContext();

            cf = (ConnectionFactory)ic.lookup("/ConnectionFactory");

            orderQueue = (Queue)ic.lookup("/queues/OrderQueue");

            connection = cf.createConnection();

            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

            producer = session.createProducer(orderQueue);
            consumer = session.createConsumer(orderQueue);

            connection.start();

            TextMessage message = session.createTextMessage("This is an order");
            producer.send(message);

            TextMessage receivedMessage = (TextMessage)consumer.receive();
            System.out.println("Got order: " + receivedMessage.getText());
        }
        catch (Exception e)
        {
           e.printStackTrace();
        }
    }

然而,每当我运行它时,它都会崩溃并出现以下异常:

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(NamingManager.java:662)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:344)
    at javax.naming.InitialContext.lookup(InitialContext.java:411)

我想我已经尝试了一切来让它运行,但它仍然让我无法理解我做错了什么。非常感谢您对此事提出任何建议!

【问题讨论】:

    标签: jms jndi hornetq


    【解决方案1】:

    首先,我将从与您使用的 HornetQ 版本直接相关的the documentation 开始。

    我认为您的客户端代码中可能缺少库。请确保将 $HORNETQ_HOME/lib 内容添加到客户端依赖项中,看看是否有效。否则更新您的问题,并会再次尝试提供帮助:)

    【讨论】:

    • 嗯,我试过了......但它不起作用!据我所知,HornetQ 启动正常,初始化 JNDI 服务,创建所有管理对象,但客户端无法与 JNDI 服务建立通信!
    • 也许在客户端需要做更多的工作来配置 JNDI 的正确使用(缺少 jndi.properties 或该文件中的设置不完整)!
    • 您可以尝试以编程方式将您的 jndi 属性传递给初始上下文吗?不确定它是否正确选择了配置文件。
    【解决方案2】:

    你的 jndi.properties 文件在你的类路径中吗?听起来好像在服务器的配置路径中,但是您的客户端代码找不到它。

    【讨论】:

      【解决方案3】:

      您还可以通过编程将信息放入上下文中,尝试使用 PROVIDER_URL、INITIAL_CONTEXT_FACTORY 和 URL_PKG_PREFIXES 的值定义哈希表;并将其传递给 InitialContext 构造函数

      Context ctxt = InitalContext(hashtable_w_values);
      

      对我来说效果很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-26
        • 2016-09-07
        • 2016-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-23
        • 2021-08-16
        相关资源
        最近更新 更多