SpringBoot集成RabbitMQ消息中间件

RabbitMQ 是一个开源的消息代理软件,其核心作用是‌在分布式系统中提供可靠的异步消息传递机制,实现应用程序、服务或组件之间的解耦、流量削峰和高效通信‌。‌‌

一、RabbitMQ本地部署

RabbitMQ 是由 Erlang 语言开发的消息中间件,需要安装Erlang环境,安装步骤可以参考https://zhuanlan.zhihu.com/p/1913643800934462135https://zhuanlan.zhihu.com/p/1913643800934462135

二、实战案例

1、添加RabbitMQ依赖

XML 复制代码
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2、配置 RabbitMQ

(1)基础配置(application.yaml)

bash 复制代码
spring:
  rabbitmq:
    host: 127.0.0.1         # RabbitMQ服务器地址
    port: 5672              # 默认端口
    username: guest         # 默认用户名
    password: guest         # 默认密码
    virtual-host: /         # 虚拟主机(默认/)

(2)自定义配置类

java 复制代码
@Configuration
@EnableRabbit
public class RabbitMQConfig {
    private static final String QUEUE_NAME = "test_message";

    // 创建队列
    @Bean
    public Queue queue() {
        return QueueBuilder.durable(QUEUE_NAME).build();
    }


    // 定义交换机(以Direct为例)
    @Bean
    public DirectExchange demoExchange() {
        return new DirectExchange("exchange.demo");
    }

    // 绑定队列到交换机
    @Bean
    public Binding bindingDemo(Queue demoQueue, DirectExchange demoExchange) {
        return BindingBuilder.bind(demoQueue).to(demoExchange).with("routing.demo");
    }

    // 消息转换器
    @Bean
    public SimpleMessageConverter messageConverter() {
        return new SimpleMessageConverter();
    }

    // RabbitTemplate配置
    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory,
                                         SimpleMessageConverter messageConverter) {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMessageConverter(messageConverter);
        rabbitTemplate.setMandatory(true);
        return rabbitTemplate;
    }

    // 消费者容器工厂配置
    @Bean
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(
            ConnectionFactory connectionFactory, SimpleMessageConverter messageConverter) {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setMessageConverter(messageConverter);

        // 高并发配置
        factory.setConcurrentConsumers(10);
        factory.setMaxConcurrentConsumers(50);
        factory.setPrefetchCount(200);
        factory.setBatchSize(100);
        factory.setReceiveTimeout(5000L);
        factory.setAcknowledgeMode(AcknowledgeMode.NONE);

        // 重试配置
        factory.setRecoveryInterval(5000L);
        return factory;
    }
}

3、发送消息

定义一个生产者服务类RabbitMQProducerService,使用RabbitTemplate实现消息发送

java 复制代码
/**
 * 创建生产者服务类
 */
@Service
public class RabbitMQProducerService {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    private static final Logger log = LoggerFactory.getLogger(RabbitMQProducerService.class);

    /**
     * 发送消息到test_message队列 默认交换机
     * @param data 消息
     */
    public void sendMessage(Object data) {
        rabbitTemplate.convertAndSend("test_message", data);
        System.out.println("发送消息: " + data);
    }

    /**
     * 发送消息到指定交换机
     * @param routingKey 路由键
     * @param data 消息
     */
    public void sendToExchange(String routingKey, Object data) {
        rabbitTemplate.convertAndSend("exchange.demo", routingKey, data,
                message -> {
                    message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT); // 消息持久化
                    return message;
                });
        System.out.println("发送消息: " + data);
    }
}

4、接收消息

创建消费者服务类RabbitMQConsumerService,可以采用监听消息队列和主动拉取两种方式获取消息

(1)监听队列(注解方式)

java 复制代码
/**
 * 创建消费者服务类
 */
@Service
public class RabbitMQConsumerService {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /**
     * 推送消息
     * @param message
     */
    @RabbitListener(queues = "test_message")
    public void receiveMessage(String message) {
        System.out.println("时间:"+ sdf.format(System.currentTimeMillis()) +"后接收到的消息: " + message);
    }

}

(2)主动拉取消息(使用注解Scheduled)

需要在启动类上添加@EnableScheduling注解,开启定时从消息队列拉取消息

java 复制代码
/**
 * 创建消费者服务类
 */
@Service
public class RabbitMQConsumerService {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /**
     * 推送消息
     * @param message
     */
    @RabbitListener(queues = "test_message")
    public void receiveMessage(String message) {
        System.out.println("时间:"+ sdf.format(System.currentTimeMillis()) +"后接收到的消息: " + message);
    }

    /**
     * 主动拉取消息
     * @param "test_message" 队列名称
     * @return 消息内容,如果无消息返回null
     */
    @Scheduled(fixedDelay = 5000)
    public String pullMessage() {
        // 设置接收超时时间(毫秒)
        Message message = rabbitTemplate.receive("test_message", 1000);

        if (message != null) {
            String body = new String(message.getBody());
            System.out.println("拉取信息: " + body);
            return body;
        }
        System.out.println("No message available");
        return null;
    }
}

三、测试结果

创建MessageController类,定义一个接口,实现消息发送。

java 复制代码
@RestController
@RequestMapping ("/message")
public class MessageController {
    @Autowired
     private RabbitMQProducerService rabbitMQProducerService;

     @RequestMapping ("/testMessage")
     public String testMessage(@RequestParam  String message) {
         rabbitMQProducerService.sendMessage(message);
//          rabbitMQProducerService.sendToExchange("routing.demo", message);
         return "success";
     }
}

(1)调用接口,消息队列存在消息,推送消息给消费者

(2)按设置的间隔时间主动轮询消息队列,主动拉取信息

四、应用场景

  • 系统解耦‌:在微服务或分布式架构中,将紧耦合的同步调用改为异步消息传递。例如,订单系统生成订单后,通过 RabbitMQ 通知库存、支付等系统,避免直接依赖。‌‌
  • ‌异步任务处理‌:对耗时操作(如发送邮件、短信通知)进行异步化,提升主业务流程效率。用户注册成功后,立即返回注册成功状态,而通知任务由消息队列后台处理。‌‌
  • 流量削峰‌:在秒杀、促销等突发高并发场景下,将请求暂存于队列中,系统按处理能力逐步消费,避免服务崩溃。‌
  • ‌数据同步与分发‌:将数据变更事件通过消息队列同步到缓存、搜索引擎等系统,实现跨系统数据一致性。‌‌

五、总结

RabbitMQ是一个基于Erlang开发的开源消息中间件,用于实现分布式系统的异步通信。本文介绍了RabbitMQ的本地部署方法,并通过Spring Boot集成展示了实际应用案例。以上是本篇文章的全部内容,如对你有帮助帮忙点赞+转发+收藏

相关推荐
iRuriCatt13 分钟前
智慧景区管理系统 | 计算机毕设项目
java·前端·spring boot·vue·毕设
天空属于哈夫克331 分钟前
企业微信外部群运营升级:API 主动推送消息开发实战
java·数据库·mysql
qq_124987075333 分钟前
基于springboot的会议室预订系统设计与实现(源码+论文+部署+安装)
java·vue.js·spring boot·后端·信息可视化·毕业设计·计算机毕业设计
愿你天黑有灯下雨有伞39 分钟前
java动态渲染列导出以及分页列表
java
星火开发设计44 分钟前
共用体 union:节省内存的特殊数据类型
java·开发语言·数据库·c++·算法·内存
2301_803554521 小时前
阻塞,非阻塞,同步,异步以及linux上的5种IO模型阻塞,非阻塞,信号驱动,异步,IO复用
java·服务器·网络
仰望星空_Star1 小时前
Java证书操作
java·开发语言
河北小博博1 小时前
分布式系统稳定性基石:熔断与限流的深度解析(附Python实战)
java·开发语言·python
岳轩子1 小时前
JVM Java 类加载机制与 ClassLoader 核心知识全总结 第二节
java·开发语言·jvm
J_liaty1 小时前
Spring Boot + MinIO 文件上传工具类
java·spring boot·后端·minio