WildFly内置ActiveMQ Artemis中queue与jms-queue区别及使用问题
问题1:
messaging-activemq子系统服务端配置中queue与jms-queue的区别 两者核心差异本质是Artemis原生能力和JMS规范适配层的区别,具体如下:
- 归属层级不同:
queue是Artemis消息代理的原生核心队列配置,属于Artemis自身的能力范畴,不绑定任何Java EE规范;jms-queue是WildFly封装的JMS规范适配层配置,本质是在底层自动创建对应原生queue的基础上,额外完成JMS属性映射、JNDI绑定等适配逻辑。 - 配置能力不同:
queue支持配置Artemis所有原生高级参数,包括自定义路由规则、持久化策略、重传机制、集群分流规则等;jms-queue仅暴露JMS规范定义的配置项,所有参数会自动映射到底层原生queue的对应属性,无需手动适配。 - JNDI行为不同:
jms-queue配置时必填entries属性,配置完成后会自动将队列实例注册到指定的JNDI路径,Java EE应用可以直接通过@Resource注解注入或者JNDI查找获取JMS队列实例;原生queue默认不会注册到JNDI,需要额外配置独立的JNDI绑定规则才能被JMS API识别。 - 适用场景不同:
queue适用于非JMS架构的通信场景,或者需要深度定制Artemis队列行为的特殊需求;jms-queue是Java EE生态下使用JMS API的标准配置方式,适配包括MDB在内的所有Java EE消息组件。
问题2:使用MessageDriven Bean时,是否可以用
queue替代jms-queue 可以实现,但不建议在标准Java EE场景下这么操作
- 可实现的前提:只要完成两项额外配置即可对接MDB:
- 为原生
queue手动添加JNDI绑定规则,将队列实例注册到应用可访问的JNDI命名空间 - 在MDB的
@ActivationConfigProperty配置中,正确指定队列的JNDI路径,以及Artemis原生资源适配器的连接参数
- 为原生
- 不推荐的原因:
- 额外配置成本高:需要手动完成JNDI绑定、激活属性映射等操作,远不如直接使用
jms-queue配置entries属性即可直接对接MDB简便 - 兼容性差:原生
queue的配置完全是Artemis私有的,后续如果要迁移到其他兼容JMS规范的应用服务器,所有配置都需要完全重写,jms-queue的配置则可以做到最小改动迁移 - 容易出现功能异常:原生
queue默认不会自动关联JMS规范定义的事务、消息确认、消息类型转换等逻辑,需要手动配置对应映射规则,稍有不慎就会出现消息丢失、事务不生效、消息格式解析错误等问题。
- 额外配置成本高:需要手动完成JNDI绑定、激活属性映射等操作,远不如直接使用
内容的提问来源于stack exchange,提问作者Wafa
相关产品推荐
相关产品推荐

