You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:12:47