Wildfly Swarm中STOMP接收器启动失败问题求助
你这是踩了个典型的依赖兼容坑——你用了ActiveMQ 5.x的STOMP相关依赖,但Wildfly 11(以及对应的Swarm版本)内嵌的是Apache ActiveMQ Artemis 1.5.x,这俩是完全不同的产品,Artemis有自己独立的STOMP协议实现,和ActiveMQ 5的依赖根本不兼容,这就是你碰到AMQ222203错误的核心原因。下面是一步步的解决办法:
1. 先清理错误的依赖
把你pom里加的这几个依赖全部删掉,它们完全不适合当前的Artemis环境:
<dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-rar</artifactId> <version>5.15.2</version> <type>rar</type> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-stomp</artifactId> <version>5.15.2</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.5.Final</version> </dependency>
Swarm会自动管理Netty相关依赖,手动添加反而容易引发版本冲突。
2. 引入正确的Artemis STOMP支持依赖
你需要添加和Wildfly 11内嵌Artemis版本严格匹配的STOMP协议模块,同时确保Swarm的messaging片段正确加载。在pom.xml里加入以下依赖:
<!-- Wildfly Swarm Messaging ActiveMQ片段,确保Artemis核心功能正常加载 --> <dependency> <groupId>org.wildfly.swarm</groupId> <artifactId>messaging-activemq</artifactId> <version>2017.12.1</version> </dependency> <!-- Artemis STOMP协议模块,版本和Wildfly 11内嵌的Artemis保持一致(1.5.6) --> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>artemis-protocol-stomp</artifactId> <version>1.5.6</version> <scope>provided</scope> </dependency>
这里scope=provided是因为Swarm的messaging片段已经包含了Artemis核心包,但STOMP模块默认不会自动引入,所以需要显式添加,版本一定要和Wildfly 11对应的Artemis版本匹配(1.5.6是Wildfly 11的默认Artemis版本)。
3. 验证你的接收器配置
你的acceptor配置本身没大问题,可以再确认几个细节:
<acceptor name="stomp-acceptor" factory-class="org.apache.activemq.artemis.core.remoting.impl.netty.NettyAcceptorFactory"> <param name="protocols" value="STOMP"/> <param name="host" value="${jboss.bind.address:127.0.0.1}"/> <param name="port" value="61613"/> <!-- 可选:如果需要指定STOMP版本,可添加这个参数 --> <param name="stomp-version" value="1.2"/> </acceptor>
确保factory-class是Artemis的Netty实现,这点你已经做对了。
4. 确认Swarm的片段自动识别
如果你依赖Swarm自动加载配置片段,确保你的standalone-full.xml里的messaging配置能被Swarm正确识别。要是还是有问题,可以尝试在启动类的main()方法里手动启用messaging片段:
public static void main(String[] args) throws Exception { Swarm swarm = new Swarm(); swarm.fraction(new MessagingFraction()); swarm.start(); }
为什么之前的方案没用?
你找的那些资源大多是关于连接外部ActiveMQ或者MQTT的场景,和你当前内嵌Artemis启用STOMP的需求不匹配。Wildfly Swarm 2017.12.1对Artemis 1.5的STOMP支持是完整的,只是你用错了依赖——ActiveMQ 5和Artemis虽同属Apache,但代码库完全独立,不能混用它们的协议模块。
按照上面的步骤调整后,重新构建fat WAR并启动,STOMP接收器应该就能正常加载,不会再出现AMQ222203错误了。
内容的提问来源于stack exchange,提问作者Gregor

