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

问题描述 投票:0回答:1

我不想使用

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");

我的问题是,当我打电话给这个班级时:

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$2
dynamicQueues: org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory$1

那么我怎样才能改变我添加的对象类型

jndi_env.put("topic.example","example");
所以它会像这样(当然对于主题)

queue: org.apache.activemq.artemis.jndi.ReadOnlyContext
queue/exampleQueue: org.apache.activemq.artemis.jms.client.ActiveMQQueue
java jms jndi activemq-artemis
1个回答
3
投票

当您创建

InitialContext
时,您传入了错误的工厂。目前您正在传入
org.apache.activemq.jndi.ActiveMQInitialContextFactory
。这是 ActiveMQ Classic 的工厂,而不是 ActiveMQ 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");
© www.soinside.com 2019 - 2024. All rights reserved.