Spring Boot 3集成ActiveMQ Artemis JUnit 5测试连接问题及解决
Spring Boot 3.0.x + ActiveMQ Artemis JUnit 5测试:解决JMS消费者无法接收消息的问题
问题背景
我基于Spring Boot 3.0.x开发了一个接收ActiveMQ Artemis队列消息的应用,需要编写JUnit 5测试验证消费者能否正确接收消息。
踩坑经历
- 一开始尝试用
artemis-junit-5模块,声明EmbeddedActiveMQExtension,在@BeforeEach里启动服务、创建队列,结果跑测试直接抛出ActiveMQNotConnectedException,提示无法连接服务器。 - 原本以为应该用带JMS管理器的
EmbeddedJMSExtension,但翻遍artemis-junit-5的包都找不到这个类。 - 修改
application.properties配置也没用,只能在同一个测试方法里自己发自己收,应用中的@JmsListener完全没反应。
解决方法
参考Artemis官方测试配置,自定义一个embedded-artemis-jms.xml配置文件,把队列和核心参数都配置好,初始化EmbeddedActiveMQExtension时加载这个配置,问题直接解决。
1. 编写自定义配置文件
在src/test/resources下创建embedded-artemis-jms.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <configuration xmlns="urn:activemq" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:activemq /schema/artemis-server.xsd"> <core xmlns="urn:activemq:core"> <!-- 关闭持久化,适配测试场景 --> <persistence-enabled>false</persistence-enabled> <journal-type>NIO</journal-type> <!-- 测试用存储目录,自动生成在target下 --> <paging-directory>target/data/paging</paging-directory> <bindings-directory>target/data/bindings</bindings-directory> <journal-directory>target/data/journal</journal-directory> <large-messages-directory>target/data/large-messages</large-messages-directory> <journal-file-size>10MB</journal-file-size> <journal-min-files>2</journal-min-files> <!-- 配置VM协议的acceptor,测试用本地连接足够 --> <acceptors> <acceptor name="in-vm">vm://0</acceptor> </acceptors> <!-- 放开权限,测试无需复杂认证 --> <security-settings> <security-setting match="#"> <permission type="createNonDurableQueue" roles="guest"/> <permission type="deleteNonDurableQueue" roles="guest"/> <permission type="createDurableQueue" roles="guest"/> <permission type="deleteDurableQueue" roles="guest"/> <permission type="consume" roles="guest"/> <permission type="send" roles="guest"/> </security-setting> </security-settings> <address-settings> <address-setting match="#"> <dead-letter-address>DLQ</dead-letter-address> <expiry-address>ExpiryQueue</expiry-address> <redelivery-delay>0</redelivery-delay> <max-size-bytes>10485760</max-size-bytes> <page-size-bytes>2097152</page-size-bytes> <address-full-policy>PAGE</address-full-policy> <auto-create-queues>true</auto-create-queues> <auto-create-addresses>true</auto-create-addresses> </address-setting> </address-settings> <!-- 配置测试目标队列 --> <addresses> <address name="test-queue"> <anycast> <queue name="test-queue"/> </anycast> </address> </addresses> </core> </configuration>
2. 测试类中加载配置
修改测试类,让EmbeddedActiveMQExtension加载自定义配置:
import org.apache.activemq.artemis.junit.EmbeddedActiveMQExtension; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.jms.core.JmsTemplate; import static org.junit.jupiter.api.Assertions.assertEquals; @SpringBootTest public class JmsConsumerIntegrationTest { // 注册Extension并加载自定义配置 @RegisterExtension static EmbeddedActiveMQExtension artemisExtension = EmbeddedActiveMQExtension.builder() .withConfigResource("embedded-artemis-jms.xml") .build(); @Autowired private JmsTemplate jmsTemplate; // 注入你的JMS消费者类(带@JmsListener注解) @Autowired private TestQueueConsumer consumer; @Test void testMessageConsumption() throws InterruptedException { String testContent = "Test message for Artemis"; // 发送消息到测试队列 jmsTemplate.convertAndSend("test-queue", testContent); // 短暂等待消费者处理消息(根据实际业务调整时长) Thread.sleep(1000); // 验证消费者是否收到消息 assertEquals(testContent, consumer.getLastReceivedMessage()); } }
关键注意点
EmbeddedActiveMQExtension默认配置没有开启完整的JMS支持,也不会自动创建测试所需的队列,导致Spring的@JmsListener无法正确绑定到嵌入式服务。- 自定义配置里必须明确配置
acceptor(VM协议适合测试,避免网络问题)、权限规则,以及目标队列,确保Spring应用能正常连接并监听队列。
内容的提问来源于stack exchange,提问作者A. Paga
相关产品推荐
相关产品推荐

