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

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测试验证消费者能否正确接收消息。

踩坑经历

  1. 一开始尝试用artemis-junit-5模块,声明EmbeddedActiveMQExtension,在@BeforeEach里启动服务、创建队列,结果跑测试直接抛出ActiveMQNotConnectedException,提示无法连接服务器。
  2. 原本以为应该用带JMS管理器的EmbeddedJMSExtension,但翻遍artemis-junit-5的包都找不到这个类。
  3. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:35:40