SpringBoot开发——Spring Boot 3.3整合RabbitMQ构建高效稳定的消息队列系统

ops/2024/11/14 4:07:24/

文章目录

  • 一、配置 RabbitMQ
  • 二、自动配置的核心组件
  • 三、发送消息至指定 Stream
  • 四、接收消息与 @RabbitListener 注解
  • 五、实现自定义 RabbitListenerContainerFactory
  • 六、消息重试机制
  • 七、总 结

消息队列在分布式系统中起着至关重要的作用,它能够解耦系统、削峰填谷,并提高系统的可靠性。而基于 AMQP(Advanced Message Queuing Protocol)协议RabbitMQ 是一个轻量级、高可靠的消息中间件。 Spring Boot 提供了 spring-boot-starter-amqp 依赖,使得 AMQPRabbitMQ 的集成变得非常便捷。

一、配置 RabbitMQ

Spring Boot 项目中,配置 RabbitMQ 非常简单。可以直接在 application.ymlapplication.properties 文件中定义 RabbitMQ 的连接信息:

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=secret

提示:如果需要通过 URI 进行连接,可以将这些配置聚合为一个地址属性 spring.rabbitmq.addresses。

此外,Spring Boot 提供的 RabbitProperties 类还支持 SSL、连接超时、心跳检测等高级选项。只需在 application.yml 中添加相应配置,即可大幅提高连接的安全性和稳定性。

二、自动配置的核心组件

Spring Boot 会自动配置一些核心的 RabbitMQ 组件,主要包括:

AmqpTemplate:用于发送消息到指定的队列。

AmqpAdmin:用于管理 RabbitMQ 队列、交换机等资源。

示例代码:

import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.stereotype.Component;@Component
public class MyMessagingService {private final AmqpAdmin amqpAdmin;private final AmqpTemplate amqpTemplate;public MyMessagingService(AmqpAdmin amqpAdmin, AmqpTemplate amqpTemplate) {this.amqpAdmin = amqpAdmin;this.amqpTemplate = amqpTemplate;}public void sendMessage(String queue, String message) {this.amqpTemplate.convertAndSend(queue, message);}public void getQueueInfo(String queue) {this.amqpAdmin.getQueueInfo(queue);}
}

通过 AmqpTemplate 可以轻松将消息发送至指定队列,而 AmqpAdmin 则可以查询或管理队列的状态。

三、发送消息至指定 Stream

在某些应用场景下,可能需要将消息发送至指定的 Stream。可以在配置文件中添加如下内容:

spring.rabbitmq.stream.name=my-stream

这种方式通过一个集中的 Stream 管理消息流转,更适合在多节点分布式架构中进行高效通信。

四、接收消息与 @RabbitListener 注解

接收 RabbitMQ 消息的方式非常灵活。可以在任意 Bean 中通过 @RabbitListener 注解定义一个消息监听器。

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
public class MyMessageListener {@RabbitListener(queues = "someQueue")public void processMessage(String content) {System.out.println("Received message: " + content);}
}

五、实现自定义 RabbitListenerContainerFactory

在实际应用中,可以自定义 RabbitListenerContainerFactory 来实现更复杂的配置。Spring Boot 提供了 SimpleRabbitListenerContainerFactoryConfigurerDirectRabbitListenerContainerFactoryConfigurer,可以通过配置工厂来绑定不同的消息转换器或监听器参数:

import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitConfig {@Beanpublic SimpleRabbitListenerContainerFactory myFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer,ConnectionFactory connectionFactory) {SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();configurer.configure(factory, connectionFactory);factory.setMessageConverter(new MyCustomMessageConverter());return factory;}
}

六、消息重试机制

在消息处理中,偶尔会遇到网络异常或资源暂时不可用的情况。为了提高系统的可靠性,RabbitMQ 提供了消息重试机制。可以在 application.yml 中启用并配置重试机制:

spring.rabbitmq.template.retry.enabled=true
spring.rabbitmq.template.retry.initial-interval=2s
spring.rabbitmq.template.retry.max-attempts=3

默认情况下,Spring Boot 禁用了重试机制。开启重试机制后,可以在短时间内重发失败的消息,提高消息的可靠性和传递成功率。

七、总 结

Spring BootRabbitMQ 的结合能够显著简化消息队列系统的开发。通过合理配置和自动化管理,开发者可以快速构建出高效、可靠的分布式消息传递系统。在高并发环境下,RabbitMQ 的异步、解耦和消息重试机制能够显著提升系统的稳定性和性能。


http://www.ppmy.cn/ops/132988.html

相关文章

Innovus Flexible H-tree and Multi-tap Clock Flow Lab实操系列教程(Day1)

我们都知道时钟树综合在数字IC后端实现中的重要性。做clock tree主要有传统clock tree做法,H tree,Flexible H-tree,fishbone等做法。接下去小编将拿cadence官方的这份Innovus Flexible H-tree and Multi-Tap Clock Flow和对应的lab data来做…

[Element] el-table修改滚动条上部分的背景色

[Element] el-table修改滚动条上部分的背景色 ::v-deep .el-table__cell .gutter {background: red;}

C语言中,“extern”关键字的含义与用法

在C语言中,extern 关键字用于声明一个已经在其他地方定义的变量或函数。它的主要作用是告诉编译器,某个变量或函数是在当前文件之外定义的,编译器应该在链接阶段找到这个变量或函数的实际定义。以下是 extern 的一些常见用途和用法&#xff1…

Sentinel — 微服务保护

微服务架构将大型应用程序拆分为多个小而独立的服务,每个服务可以独立部署和扩展。然而,微服务系统需要面对的挑战也随之增加,例如服务之间的依赖、分布式环境下的故障传播和安全问题。因此,微服务保护措施是确保系统在高并发、资…

吴恩达机器学习笔记(1)

吴恩达机器学习笔记 监督学习 定义 监督学习是一种机器学习方法,其中模型从输入数据(特征)和相应的输出标签(目标)中学习,目的是能够预测或决定新实例的输出标签。 监督学习机器学习中的核心概念之一&am…

初识Linux · 匿名管道

目录 前言: 匿名管道 理解为什么? 理解是什么? 理解怎么做? 前言: 引入管道之前,我们引入几个问题,进程通信的相关问题。 第一个是进程之间为什么要通信,对于进程间通信来说&…

多态之魂:C++中的优雅与力量

文章目录 1. 多态的概念1.1 编译时多态(静态多态)1.2 运行时多态(动态多态) 2. 多态的定义及实现2.1 多态的构成条件2.1.1 实现多态还有两个必须重要条件:2.1.2 虚函数2.1.3 虚函数的重写/覆盖1. 虚函数的重写&#xf…

【初阶数据结构与算法】线性表之链表的分类以及双链表的定义与实现

文章目录 一、链表的分类二、双链表的实现1.双链表结构的定义2.双链表的初始化和销毁初始化函数1初始化函数2销毁函数 3.双链表的打印以及节点的申请打印函数节点的申请 4.双链表的头插和尾插头插函数尾插函数 5.双链表的查找和判空查找函数判空函数 6.双链表的头删和尾删头删函…