通过JNDI使用ActiveMQ

我正在尝试使用JNDI创建与ActiveMQ的简单连接。


我有

  1. 队列名为’example.A’。

  2. 根据触及JNDI的ActiveMQ文档 ,如果我想通过JNDI使用ConectionFactories和Queues(Topics),我必须在我的类路径上放置jndi.properties文件。 据我所知,默认情况下,activeMQ类路径是%activemq%/ conf目录。 我没有改变它。 所以我的队列有这个属性:

    queue.MyQueue = example.A

  3. 我为ActiveMQ创建了java客户端类,它使用JNDI如下:

    Properties jndiParameters = new Properties() ; jndiParameters.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory"); jndiParameters.put(Context.PROVIDER_URL, "tcp://localhost:61616"); Context context = new InitialContext(jndiParameters); ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("ConnectionFactory"); Queue queue = (Queue) context.lookup("MyQueue"); 

但它找不到我的队列,它抛出exception:javax.naming.NameNotFoundException:MyQueue

我的错误在哪里?

问题是您显式创建属性并将它们传递给InitialContext构造函数。 这意味着将不会读取类路径上的jndi.properties。

你的代码应该是这样的:

 Context context = new InitialContext(); ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("ConnectionFactory"); Queue queue = (Queue) context.lookup("MyQueue"); 

您可以设置静态属性,也可以从文件中检索它们:

  InputStream is = getClass().getResourceAsStream("/my.jndi.properties"); Properties jndiParameters = new Properties(); jndiParameters.load(is); jndiParameters.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory"); jndiParameters.put(Context.PROVIDER_URL, "tcp://localhost:61616"); Context ctx = new InitialContext(jndiParameters); ... 

只要在加载资源后设置静态道具,这就可以工作。 如果您从其他地方加载提供者URL,则会很有帮助。