只需三步:内嵌ActiveMQ到SpringBoot应用中

简介: 不知你是否有过这样的体验:在调试带JMS组件的应用时, 需要额外启动一个JMS服务器来配合测试。这样既操作繁琐,又不利于实现单元测试——不符合单元测试AIR原则(自动化,独立性,可重复,请参考《阿里巴巴Java开发手册》中的“单元测试”章节)。

不知你是否有过这样的体验:

在调试带JMS组件的应用时, 需要额外启动一个JMS服务器来配合测试。

这样既操作繁琐,又不利于实现单元测试——不符合单元测试AIR原则(自动化,独立性,可重复,请参考《阿里巴巴Java开发手册》中的“单元测试”章节)。

有时侯,我们需要一个随应用启动的JMS服务器,今天我们就来讲一下,如何在SpringBoot应用中内嵌一个ActiveMQ JMS Broker。

让我们开始吧

首先说明所有的文档来源,供各位深入研究。

本文所涉及的文档均来源于各组件的官方网站中。这里列举如下。
如何编写ActiveMQ Embedded broker
ActiveMQ XML配置指南
SpringBoot官方文档

示例代码则请参考我的github目录EmbbededActiveMQ

第一步:准备配置文件activemq.xml

activemq.xml是ActiveMQ的主要配置文件,可以通过其指定ActiveMQ的行为。

可以在ActiveMQ安装目录下的conf文件夹下找到默认的activemq.xml文件。在其基础上修改。

这里我们采用最小配置。

   <broker xmlns="http://activemq.apache.org/schema/core" brokerName="mybroker" useJmx="true">
        <persistenceAdapter>
            <kahaDB directory="./kahadb"/>
        </persistenceAdapter>

        <transportConnectors>
            <transportConnector name="openwire" uri="tcp://0.0.0.0:61616"/>
        </transportConnectors>
    </broker>

更多具体的配置项请参考ActiveMQ XML配置指南

第二步:添加依赖

编写maven项目的pom文件。添加一些必要的依赖。

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-spring</artifactId>
            <version>5.12.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-kahadb-store</artifactId>
            <version>5.12.3</version>
        </dependency>
    </dependencies>

spring-boot-starter-activemq:由SpringBoot官方提供,这里要用来编写收发消息的代码。
activemq-spring :为ActiveMQ嵌入Spring应用提供支持。
activemq-kahadb-store :为ActiveMQ中配置队列持久化提供必要的依赖。

如果在activemq.xml中配置了其它功能,可能需要额外的依赖。可以根据应用启动时的 ClassNotFoundException 报错提示信息自行添加。

第三步:编写测试代码

添加ActiveMQ加载的代码。

    @Bean
    public BrokerFactoryBean activemq() throws Exception {
        BrokerFactoryBean broker = new BrokerFactoryBean();
        broker.setConfig(new ClassPathResource("activemq.xml"));
        broker.setStart(true);
        return broker;
    }

添加一个生产者和两个消费者。

    // 生产者,启动应用后自动发送10条消息
    @Bean
    public CommandLineRunner testSend() {
        return new CommandLineRunner() {
            @Override
            public void run(String... args) throws Exception {
                for (int i = 0; i < 10; ++i) {
                    jmsTemplate.convertAndSend("test", "message");
                }
            }
        };
    }

   // 消费者1
   @JmsListener(destination = "test")
    public void receive1(String message) {
        System.out.println("One Receive: " + message);
    }
    // 消费者2
    @JmsListener(destination = "test")
    public void receive2(String message) {
        System.out.println("Two Receive: " + message);
    }

再添加上SpringBoot应用的application.yml配置。

spring:
  activemq:
    broker-url:
      tcp://localhost:61616

第四步: 运行并查看结果

启动应用,查看日志。


img_a52d3db4a8f05b3ab8138c15de4e69b1.png
应用启动日志

可见两个消费者各收到一半的消息,说明收发消息功能己经成功。

由于打开了JMX功能,使用JvisualVM连上应用,可以从MBean中找到自己定义的broker,并观察其执行状态。

img_49ee38a5405e27edb75e1e4f45a30472.png
JMX查看队列装态

可以看到test队列共入队并出队10条消息。

小功告成。

相关文章
|
2月前
|
消息中间件 存储 Java
第15课: Spring Boot中集成ActiveMQ
第15课: Spring Boot中集成ActiveMQ
243 0
|
6月前
|
消息中间件 存储 Java
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ安装
本教程介绍ActiveMQ的安装与基本使用。首先从官网下载apache-activemq-5.15.3版本,解压后即可完成安装,非常便捷。启动时进入解压目录下的bin文件夹,根据系统选择win32或win64,运行activemq.bat启动服务。通过浏览器访问`http://127.0.0.1:8161/admin/`可进入管理界面,默认用户名密码为admin/admin。ActiveMQ支持两种消息模式:点对点(Queue)和发布/订阅(Topic)。前者确保每条消息仅被一个消费者消费,后者允许多个消费者同时接收相同消息。
165 0
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ安装
|
6月前
|
消息中间件 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——发布/订阅消息的生产和消费
本文详细讲解了Spring Boot中ActiveMQ的发布/订阅消息机制,包括消息生产和消费的具体实现方式。生产端通过`sendMessage`方法发送订阅消息,消费端则需配置`application.yml`或自定义工厂以支持topic消息监听。为解决点对点与发布/订阅消息兼容问题,可通过设置`containerFactory`实现两者共存。最后,文章还提供了测试方法及总结,帮助读者掌握ActiveMQ在异步消息处理中的应用。
221 0
|
6月前
|
消息中间件 网络协议 Java
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ集成
本文介绍了在 Spring Boot 中集成 ActiveMQ 的详细步骤。首先通过引入 `spring-boot-starter-activemq` 依赖并配置 `application.yml` 文件实现基本设置。接着,创建 Queue 和 Topic 消息类型,分别使用 `ActiveMQQueue` 和 `ActiveMQTopic` 类完成配置。随后,利用 `JmsMessagingTemplate` 实现消息发送功能,并通过 Controller 和监听器实现点对点消息的生产和消费。最后,通过浏览器访问测试接口验证消息传递的成功性。
321 0
|
6月前
|
消息中间件 Java API
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ—— JMS 和 ActiveMQ 介绍
本文介绍如何在Spring Boot中集成ActiveMQ,首先阐述了JMS(Java消息服务)的概念及其作为与具体平台无关的API在异步通信中的作用。接着说明了JMS的主要对象模型,如连接工厂、会话、生产者和消费者等,并指出JMS支持点对点和发布/订阅两种消息类型。随后重点讲解了ActiveMQ,作为Apache开源的消息总线,它完全支持JMS规范,适用于异步消息处理。最后,文章探讨了在Spring Boot中使用队列(Queue)和主题(Topic)这两种消息通信形式的方法。
149 0
|
10月前
|
消息中间件 监控 Java
您是否已集成 Spring Boot 与 ActiveMQ?
您是否已集成 Spring Boot 与 ActiveMQ?
298 0
|
消息中间件 Java
springboot整合ActiveMQ(点对点+发布订阅)
springboot整合ActiveMQ(点对点+发布订阅)
|
消息中间件 Java Kafka
SpringBoot实用开发篇第六章(整合第三方技术,ActiveMQ,RabbitMQ,RocketMQ,Kafka)
SpringBoot实用开发篇第六章(整合第三方技术,ActiveMQ,RabbitMQ,RocketMQ,Kafka)
|
消息中间件 监控 Java
使用Spring Boot结合ActiveMQ和MQTT实现消息的发送和接收
使用Spring Boot结合ActiveMQ和MQTT实现消息的发送和接收
1053 3
|
消息中间件 Java Apache
使用Spring Boot实现与ActiveMQ的消息队列集成
使用Spring Boot实现与ActiveMQ的消息队列集成