WildFly 30配置ActiveMQ服务器报错:需配置Elytron安全域
解决WildFly 30中添加ActiveMQ默认服务器失败的问题
问题场景
在WildFly 30中尝试添加ActiveMQ默认服务器以启用MQTT支持时,执行以下CLI命令失败:
[standalone@localhost:9990 /] /subsystem=messaging-activemq/server=default:add
报错信息:
{ "outcome" => "failed", "failure-description" => "WFLYCTL0158: Operation handler failed: java.lang.IllegalStateException: WFLYMSGAMQ0107: You must define a elytron security doman when security is enabled.", "rolled-back" => true }
全新安装环境下,standalone.xml和standalone-full.xml均出现该问题,其中standalone-full.xml的messaging-activemq子系统初始配置如下:
<subsystem xmlns="urn:jboss:domain:messaging-activemq:16.0"> <remote-connector name="artemis" socket-binding="messaging-activemq"> <param name="use-nio" value="true"/> <param name="use-nio-global-worker-pool" value="true"/> </remote-connector> <pooled-connection-factory name="activemq-ra" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory" connectors="artemis" transaction="xa" user="guest" password="guest"/> </subsystem>
核心需求:在WildFly中实现MQTT over JMS。
解决方案选项
1. 配置Elytron安全域
WildFly默认提供ApplicationDomain安全域,可直接关联到ActiveMQ服务器:
- 通过CLI命令添加服务器并配置安全域:
[standalone@localhost:9990 /] /subsystem=messaging-activemq/server=default:add(security={elytron-domain=ApplicationDomain})
- 手动修改XML配置:
在messaging-activemq子系统中添加服务器节点并指定安全域:
<subsystem xmlns="urn:jboss:domain:messaging-activemq:16.0"> <server name="default"> <security elytron-domain="ApplicationDomain"/> <!-- 可按需添加acceptors、address-settings等配置 --> </server> <remote-connector name="artemis" socket-binding="messaging-activemq"> <param name="use-nio" value="true"/> <param name="use-nio-global-worker-pool" value="true"/> </remote-connector> <pooled-connection-factory name="activemq-ra" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory" connectors="artemis" transaction="xa" user="guest" password="guest"/> </subsystem>
2. 关闭安全机制(仅本地运行场景)
若应用仅本地运行、无外部访问需求,可直接关闭ActiveMQ的安全校验:
- 通过CLI命令添加无安全的服务器:
[standalone@localhost:9990 /] /subsystem=messaging-activemq/server=default:add(security-enabled=false)
- 手动修改XML配置:
<subsystem xmlns="urn:jboss:domain:messaging-activemq:16.0"> <server name="default" security-enabled="false"> <!-- 可添加MQTT acceptor配置,示例: <acceptor name="mqtt"> <factory-class>org.apache.activemq.artemis.core.remoting.impl.netty.NettyAcceptorFactory</factory-class> <param name="port" value="1883"/> <param name="protocols" value="MQTT"/> </acceptor> --> </server> <remote-connector name="artemis" socket-binding="messaging-activemq"> <param name="use-nio" value="true"/> <param name="use-nio-global-worker-pool" value="true"/> </remote-connector> <pooled-connection-factory name="activemq-ra" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory" connectors="artemis" transaction="xa" user="guest" password="guest"/> </subsystem>
3. 独立部署ActiveMQ Artemis并配置远程连接
若希望解耦消息服务与应用服务器,可独立部署ActiveMQ Artemis,再在WildFly中配置远程连接:
- 下载并启动独立的ActiveMQ Artemis,确保启用MQTT协议(默认端口1883);
- 在WildFly的
messaging-activemq子系统中配置指向独立Artemis的连接:
<subsystem xmlns="urn:jboss:domain:messaging-activemq:16.0"> <remote-connector name="remote-artemis" socket-binding="remote-messaging"> <param name="use-nio" value="true"/> <param name="protocols" value="CORE,AMQP,STOMP,MQTT"/> </remote-connector> <pooled-connection-factory name="remote-activemq-ra" entries="java:/RemoteJmsXA java:jboss/RemoteDefaultJMSConnectionFactory" connectors="remote-artemis" transaction="xa" user="admin" password="admin"/> </subsystem>
同时在socket-binding-group中添加对应的socket绑定:
<socket-binding name="remote-messaging" port="61616"/>
内容的提问来源于stack exchange,提问作者mr mcwolf
相关产品推荐
相关产品推荐

