Spring Boot + ActiveMQ Artemis:快速实现高效消息队列处理功能

在现代微服务架构中,消息队列是实现异步通信、解耦系统的重要手段。而通过 Spring Boot 和 ActiveMQ Artemis,您可以快速搭建一个高效、可靠的消息队列处理系统,轻松应对订单处理、日志分析等场景。本文将带您从零开始,逐步实现一个完整的消息队列处理功能。


一、为什么选择 ActiveMQ Artemis?

ActiveMQ Artemis 是 Apache ActiveMQ 的高性能消息代理,具备以下优势:

  • 轻量级:支持嵌入式模式,无需单独部署服务。
  • 高性能:消息吞吐量高,延迟低。
  • 兼容性强:支持多种协议(AMQP、STOMP、MQTT 等)以及与 Spring Boot 的无缝集成。
  • 易用性:提供管理控制台和丰富的监控接口。

无论是嵌入式模式还是独立部署模式,ActiveMQ Artemis 都能满足不同规模的应用需求。


二、Spring Boot 快速搭建消息队列

1. 引入依赖

pom.xml 中添加以下依赖:

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-artemis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>RELEASE</version><scope>compile</scope></dependency><dependency><groupId>org.apache.activemq</groupId><artifactId>artemis-jakarta-server</artifactId><version>2.37.0</version></dependency>

2. 配置消息队列

application.yml 中配置消息队列:

嵌入式模式配置
spring:artemis:embedded:enabled: truepersistent: falsequeues: order-queue # 自动创建队列

独立模式配置

spring:artemis:broker-url: tcp://localhost:61616user: adminpassword: admin

根据实际需求选择一种模式。如果您需要快速试验,可以使用嵌入式模式;如果应用需在生产环境运行,推荐使用独立模式。

三、消息生产者

消息生产者负责向队列发送消息。以下是实现代码:

import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;@Service
public class OrderMessageProducer {private final JmsTemplate jmsTemplate;public OrderMessageProducer(JmsTemplate jmsTemplate) {this.jmsTemplate = jmsTemplate;}public void sendOrderMessage(String order) {jmsTemplate.convertAndSend("order-queue", order);System.out.println("Sent order: " + order);}
}

调用 sendOrderMessage 方法即可发送订单信息到队列 order-queue

四、消息消费者

消费者监听队列中的消息并进行处理。通过 @JmsListener 注解可以轻松实现:

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Service;@Service
public class OrderMessageConsumer {@JmsListener(destination = "order-queue")public void processOrder(String order) {System.out.println("Processing order: " + order);// 模拟处理逻辑}
}

当消息到达队列时,processOrder 方法会自动触发,输出消息内容。

五、队列监控功能

1. 监控队列状态

为确保系统稳定性,需要实时监控队列积压情况。以下是一个监控服务的实现:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;@Service
public class QueueMonitorService {@Autowiredprivate JmsTemplate jmsTemplate;public long getQueueSize(String queueName) {return jmsTemplate.browse(queueName, (session, browser) -> {int count = 0;while (browser.getEnumeration().hasMoreElements()) {count++;browser.getEnumeration().nextElement();}return (long) count;});}
}

使用此服务可以查询任意队列的积压消息数量。

2. 暴露 REST 接口

通过 Spring Boot 的 REST 接口,可以更直观地获取监控数据

import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/monitor")
public class QueueMonitorController {private final QueueMonitorService monitorService;public QueueMonitorController(QueueMonitorService monitorService) {this.monitorService = monitorService;}@GetMapping("/queue/{name}/size")public String getQueueSize(@PathVariable String name) {long size = monitorService.getQueueSize(name);return "Queue " + name + " size: " + size;}
}

六、故障排查和优化

1. 常见问题

嵌入式模式启动失败
  • 检查日志是否有端口占用错误。
  • 确认嵌入式配置正确,避免和独立模式配置冲突。
连接失败
  • 检查 broker-url 是否正确,确保 ActiveMQ Artemis 服务已启动。
  • 确认服务端网络和防火墙规则允许客户端访问。
消息丢失
  • 确保在生产环境中启用持久化(persistent=true)。
  • 配置死信队列处理失败的消息。

2. 性能优化

  • 异步消费:设置消费者并发级别,提高吞吐量。
  • 队列分片:将大队列拆分为多个子队列,避免单点瓶颈。
  • 消息压缩:对于大消息启用压缩,减少网络传输量。

七、完整代码仓库

您可以访问 https://gitee.com/cng1985/nb-queue 查看本文完整代码示例,并快速开始构建属于自己的消息队列功能。


八、总结

通过 Spring Boot 与 ActiveMQ Artemis 的强大组合,我们可以快速实现一个功能强大且高性能的消息队列系统。无论是订单处理、通知分发还是其他场景,本文提供的代码和最佳实践都可以直接应用到实际项目中。

现在就尝试用 Spring Boot 和 ActiveMQ Artemis 为您的项目添加消息队列支持吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/61752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET9 - 新功能体验(三)

书接上回&#xff0c;我们继续来聊聊.NET9和C#13带来的新变化。 01、Linq新方法 CountBy 和 AggregateBy 引入了新的方法 CountBy 和 AggregateBy后&#xff0c;可以在不经过GroupBy 分配中间分组的情况下快速完成复杂的聚合操作&#xff0c;同时方法命名也非常直观&#xff0…

Android蓝牙架构,源文件目录/编译方式学习

Android 版本 发布时间 代号&#xff08;Codename&#xff09; Android 1.0 2008年9月23日 无 Android 1.1 2009年2月9日 Petit Four Android 1.5 2009年4月27日 Cupcake Android 1.6 2009年9月15日 Donut Android 2.0 2009年10月26日 Eclair Android 2.1 2…

YOLO-World解读:零基础学习开放世界模型

文章目录 一、摘要二、引言相关工作方法预训练公式模型架构可重新参数化的视觉-语言路径聚合网络&#xff08;RepVL-PAN&#xff09; 3.4 预训练方案 实验YOLO-World: 利用多样化数据集进行开放词汇对象检测的预训练方法YOLO-World: LVIS数据集上的零样本性能评估YOLO-World: 预…

信创改造 - TongRDS 安装方式之控制台安装【Window】

安装前准备 安装 jdk1.8 即可&#xff0c;并配上 环境变量 安装 1&#xff09;解压缩 2&#xff09;启动 进入安装路径的console\bin目录&#xff0c;在cmd命令行窗口运行console.bat 输入序号 1 如果想查看运行状态&#xff0c;可以重新执行 console.bat&#xff0c;然后输…

志愿者小程序源码社区网格志愿者服务小程序php

志愿者服务小程序源码开发方案&#xff1a;开发语言后端php&#xff0c;tp框架&#xff0c;前端是uniapp。 一 志愿者端-小程序&#xff1a; 申请成为志愿者&#xff0c;志愿者组织端进行审核。成为志愿者后&#xff0c;可以报名参加志愿者活动。 志愿者地图&#xff1a;可以…

Node.js的下载与安装(支持各种新旧版本)

目录 1、node官网 2、node软件下载 3、软件安装&#xff08;完整版&#xff09; 1、node官网 Node.js — Download Node.jshttps://nodejs.org/en/download/package-manager 2、node软件下载 按照下图进行选择node版本&#xff08;真心推荐16/18&#xff0c;而是尽量是LTS…

对于相对速度的重新理解 - 2

回到先前说的&#xff0c;先令真空光速为标准光速&#xff0c; 光子的绝对速度 范围&#xff0c; 物质粒子的 范围&#xff0c; 这样的话&#xff0c;我们就可以根据 和 &#xff0c;把速度分成3个段&#xff0c; 这样就可以出现速度和它的负值&#xff0c;也就是速度的矢量具…

大模型系列11-ray

大模型系列11-ray PlasmaPlasmaStore启动监听处理请求 ProcessMessagePlasmaCreateRequest请求PlasmaCreateRetryRequest请求PlasmaGetRequest请求PlasmaReleaseRequestPlasmaDeleteRequestPlasmaSealRequest ObjectLifecycleManagerGetObjectSealObject ObjectStoreRunnerPlas…

Java---反射机制

JAVA反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c; 都能够调用它的任意方法和属性&#xff1b;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 在编译后产生…

Java 线程状态详解

1 引言 在 Java 多线程编程中&#xff0c;线程的状态是一个非常重要的概念。了解线程的状态及其转换过程&#xff0c;有助于我们更好地理解和控制线程的行为。本文将详细介绍 Java 线程的 6 种状态&#xff0c;并通过示例代码和图解来帮助读者更好地理解这些状态及其转换过程。…

AirScreen 安卓平板作为MacOS副屏

前言&#xff1a; 对笔记本续航有刚需&#xff0c;不得不选MacBook。 手机用的是mate40Pro&#xff0c;平板用的是matepad pro 12.6 干货&#xff1a; 参考网友的分享&#xff1a; https://www.bilibili.com/video/BV12A4y1d7zX/?spm_id_from333.337.search-card.all.click 【…

深度强化学习(RL)介绍

深度强化学习&#xff08;RL&#xff09;介绍 写到了一半&#xff0c;图待后补 一、强化学习概述 &#xff08;一&#xff09;与监督学习对比及定义 强化学习不同于监督学习&#xff0c;在一些任务中数据标注困难&#xff0c;但机器可通过环境反馈知道结果好坏。强化学习是机…

使用 Elasticsearch 构建食谱搜索(二)

这篇文章是之前的文章 “使用 Elasticsearch 构建食谱搜索&#xff08;一&#xff09;” 的续篇。在这篇文章中&#xff0c;我将详述如何使用本地 Elasticsearch 部署来完成对示例代码的运行。该项目演示了如何使用 Elastic 的 ELSER 实现语义搜索并将其结果与传统的词汇搜索进…

数据结构 【带环单链表】

在单链表中可能会存在一种情况&#xff0c;某一结点在经过几次转移之后回到了自己本身&#xff0c;这种情况就称之为带环链表。对于带环链表&#xff0c;我们不能轻易对其进行遍历&#xff0c;遍历可能会导致产生死循环。 带环链表的逻辑图如下所示&#xff1a;&#xff08;这…

Vue 项目中如何使用FullCalendar 时间段选择插件(类似会议室预定、课程表)

本文中是基于VUEelementui项目中实现的前后端分离的前端功能部分&#xff1a; 插件的官方文档&#xff1a;FullCalendar 1.安装对应依赖&#xff08;统一安装版本为6.15&#xff09; npm install --save fullcalendar/core6.15 npm install --save fullcalendar/daygrid6.…

学习路之压力测试--jmeter安装教程

Jmeter安装 0、先安装jdk:这里是安装jdk-8u211-windows-x64 1、百度网盘上下载 jdk和jmeter 链接: https://pan.baidu.com/s/1qqqaQdNj1ABT1PnH4hfeCw?pwdkwrr 提取码: kwrr 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 官网&#xff1a;Apache JMeter - D…

SQL99版全外连接和交叉连接和总结

全外连接MySQL不支持 elect 查询列表 from 表名1 表别名1 cross join 表名2 表别名2 on 连接条件 ...... ; 交叉连接 就两个记录做笛卡尔积&#xff01;没什么好说的&#xff0c;基本也没用过&#xff01; 总结

Python爬虫:深入探索1688关键词接口获取之道

在数字化经济的浪潮中&#xff0c;数据的价值愈发凸显&#xff0c;尤其是在电商领域。对于电商平台而言&#xff0c;关键词不仅是搜索流量的入口&#xff0c;也是洞察市场趋势、优化营销策略的重要工具。1688作为中国领先的B2B电商平台&#xff0c;其关键词接口的获取对于商家来…

ffmpeg本地编译不容易发现的问题 — Error:xxxxx not found!

这里区分电脑CPU架构 本次编译是在Mac笔记本&#xff0c;M1芯片上进行&#xff01; 前面大致流程&#xff1a;分为两种&#xff08;1.仅适用&#xff0c;直接下载编译好的本地安装即可&#xff1b;2.使用并查看源码&#xff0c;自己修改编译运行&#xff09;。这里介绍的是第…