目前我正在努力学习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 \ folder中还有一个名为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)
我想我已经尝试了一切以使其运行,但它仍然让我无法理解我做错了什么。对此事的任何建议都非常感谢!
答案 0 :(得分:1)
首先,我会从与您正在使用的HornetQ版本直接相关的the documentation开始。
我认为您的客户端代码中可能缺少库。请确保将$HORNETQ_HOME/lib
内容添加到客户端依赖项中,看看是否有效。否则,请更新您的问题并尝试再次提供帮助:)
答案 1 :(得分:0)
你的jndi.properties文件是否在你的类路径中?它听起来像是在服务器的配置路径中,但是您的客户端代码找不到它。
答案 2 :(得分:0)
此外,您可以以编程方式将信息放在上下文中,尝试使用PROVIDER_URL,INITIAL_CONTEXT_FACTORY和URL_PKG_PREFIXES的值来定义哈希表;并将其传递给InitialContext构造函数
Context ctxt = InitalContext(hashtable_w_values);
它对我来说很好。