JBoss EAP 7.4中ActiveMQ Artemis队列无法绑定指定JNDI名称
解决JBoss EAP 7.4(ActiveMQ Artemis)动态创建队列无法绑定JNDI的问题
问题根源
你之前使用ActiveMQServerControl创建的是Artemis核心队列(属于消息系统底层实现),而非符合JMS规范的队列,因此不会自动绑定到应用服务器的全局JNDI空间。原HornetQ中使用的JMSServerControl是专门用于管理JMS资源的控制类,Artemis中也保留了对应的实现,但包路径有所变化。
正确实现方式
1. 使用Artemis的JMSServerControl创建JMS队列
导入正确的JMS管理类,调用对应方法创建队列并绑定JNDI:
import org.apache.activemq.artemis.api.jms.management.JMSServerControl; ... // 获取JMSServerControl实例(从MBServer获取,确保类型为JMSServerControl) JMSServerControl jmsServerControl = getJMSServerControl(); // 参数:队列名称、JNDI条目、消息选择器、是否持久化 jmsServerControl.createQueue("MyQName", "queue/MyQName", null, false);
2. 保留原有JNDI查找逻辑
你的查找代码无需修改,直接使用原JNDI名称即可:
import javax.jms.Queue; ... InitialContext ctx = new InitialContext(); Queue ourQueue = (Queue) ctx.lookup("queue/MyQName"); if(ourQueue == null) { log.error("Queue not found!"); } else { log.info("Queue found"); }
3. 可选:使用JSON配置创建JMS队列
如果偏好JSON格式配置,可使用JMSServerControl的重载方法,注意使用jndiNames字段(而非核心队列的entries):
String jmsQueueConfig = "{" + "\"name\": \"MyQName\"," + "\"jndiNames\": [\"queue/MyQName\"]," + "\"durable\": false," + "\"selector\": null" + "}"; jmsServerControl.createQueue(jmsQueueConfig);
关键注意事项
- 确保
getJMSServerControl()返回的是org.apache.activemq.artemis.api.jms.management.JMSServerControl实例,而非核心服务的ActiveMQServerControl。可通过MBeanServer查找对应MBean名称:org.apache.activemq.artemis:module=JMS,name=Server,type=JMSServerControl。 - 若需要供外部客户端访问,可将JNDI条目设置为
java:jboss/exported/queue/MyQName,内部应用查找时仍可使用queue/MyQName。
验证方法
通过JBoss CLI确认队列和JNDI绑定状态:
- 查看JMS队列配置:
/subsystem=messaging-activemq/server=default/jms-queue=MyQName:read-resource
- 查看JNDI绑定:
jndi view --lookup=queue/MyQName
内容的提问来源于stack exchange,提问作者Pedroz141
相关产品推荐
相关产品推荐

