如何使用 ActiveMQ 添加 JNDI 目标(主题和队列)?

How to add JNDI destinations (Topics and Queues) with ActiveMQ?

我不想使用 jdni.properties 文件,所以要向我的 JNDI 设置添加新属性,我写了以下内容:

    Hashtable<String, Object> jndi_env = new Hashtable<String, Object>();
    jndi_env.put(InitialContext.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
    jndi_env.put("connectionFactory.ConnectionFactory","vm://0");
    jndi_env.put("topic.example","example");

我的问题是,当我调用它时 class:

initialContext = new InitialContext(jndi_env);

因为我在最后一行传递了一个名称参数,所以查找了一个 URL 上下文工厂。

这使我的代码寻找我实际上不需要的 tcp://localhost:61616 连接。

我看到有

QueueConnectionFactory: org.apache.activemq.ActiveMQConnectionFactory
example: org.apache.activemq.command.ActiveMQTopic
XAConnectionFactory: org.apache.activemq.ActiveMQXAConnectionFactory

我不想要,或者至少不是他们想要的类型。

如果我使用我的 jndi.properties 文件进行检查但没有传递参数,但我没有遇到建立 tcp 连接的问题,那么我发现:

ConnectionFactory: org.apache.activemq.artemis.jms.client.ActiveMQJMSConnectionFactory
queue: org.apache.activemq.artemis.jndi.ReadOnlyContext
queue/exampleQueue: org.apache.activemq.artemis.jms.client.ActiveMQQueue
dynamicTopics: org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
dynamicQueues: org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory

那么我怎样才能改变我添加的对象类型jndi_env.put("topic.example","example");所以它会像这样(但当然是主题)

queue: org.apache.activemq.artemis.jndi.ReadOnlyContext
queue/exampleQueue: org.apache.activemq.artemis.jms.client.ActiveMQQueue

当您创建 InitialContext 时,您传入了错误的工厂。目前您正在传递 org.apache.activemq.jndi.ActiveMQInitialContextFactory。这是 ActiveMQ 5.x 的工厂,而不是 Artemis。您需要传入 org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory ,例如:

Hashtable<String, Object> jndi_env = new Hashtable<String, Object>();
jndi_env.put(InitialContext.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory");
jndi_env.put("connectionFactory.ConnectionFactory","vm://0");
jndi_env.put("topic.example","example");