通过JNDI使用ActiveMQ

时间:2009-01-17 16:46:44

标签: java jndi activemq

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

<小时/> 我有

  1. 名为'example.A'的队列。

  2. 根据ActiveMQ documentation touching JNDI,如果我想通过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");
    
  4. 但它找不到我的队列,它抛出异常:javax.naming.NameNotFoundException:MyQueue

    我的错误在哪里?

2 个答案:

答案 0 :(得分:6)

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

您的代码应该是:

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

答案 1 :(得分: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,则会很有帮助。