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集成展示了实际应用案例。以上是本篇文章的全部内容,如对你有帮助帮忙点赞+转发+收藏

相关推荐
廋到被风吹走33 分钟前
【Spring 】Spring Security深度解析:过滤器链、认证授权架构与现代集成方案
java·spring·架构
蛐蛐蜉蝣耶34 分钟前
Spring Boot实现DynamicMethodMatcherPointcut示例
java·spring boot·后端
予枫的编程笔记39 分钟前
Elasticsearch聚合分析与大规模数据处理:解锁超越搜索的进阶能力
java·大数据·人工智能·分布式·后端·elasticsearch·全文检索
BD_Marathon41 分钟前
PostMan简介
java
一勺菠萝丶41 分钟前
宝塔 vs 1Panel 有什么区别?能不能同时安装?
java
码农小卡拉42 分钟前
Springboot “钩子”:@PostConstruct注解
java·spring boot·后端·spring·spring cloud
毕设源码-郭学长1 小时前
【开题答辩全过程】以 快递仓库管理系统为例,包含答辩的问题和答案
java
奔波霸的伶俐虫1 小时前
spring boot集成kafka学习
spring boot·学习·kafka
内存不泄露1 小时前
基于Spring Boot和Vue的在线考试系统设计与实现
vue.js·spring boot·后端
꧁Q༒ོγ꧂1 小时前
算法详解(二)--算法思想基础
java·数据结构·算法