7

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


我有

  1. 名为“example.A”的队列。

  2. 根据涉及 JNDI 的 ActiveMQ 文档,如果我想通过 JNDI 使用 ConectionFactories 和队列(主题),我必须将 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");
    

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

我的错误在哪里?

4

2 回答 2

6

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

你的代码应该是这样的:

Context context = new InitialContext();
ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("ConnectionFactory");
Queue queue = (Queue) context.lookup("MyQueue");
于 2009-01-17T22:20:25.973 回答
1

您可以设置静态属性以及从文件中检索它们,如下所示:

    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,这很有帮助。

于 2011-11-18T00:43:54.377 回答