RabbitMQ 是一个开源的消息代理软件,其核心作用是在分布式系统中提供可靠的异步消息传递机制,实现应用程序、服务或组件之间的解耦、流量削峰和高效通信。
一、RabbitMQ本地部署
RabbitMQ 是由 Erlang 语言开发的消息中间件,需要安装Erlang环境,安装步骤可以参考https://zhuanlan.zhihu.com/p/1913643800934462135
https://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集成展示了实际应用案例。以上是本篇文章的全部内容,如对你有帮助帮忙点赞+转发+收藏