SpringBoot整合RabbitMQ五种消息模型的实战教学
作者:张老师技术栈
本文详细讲解五种消息模型,包括工作队列、发布订阅、路由和主题模式,并对比它们的Exchange类型与路由方式,帮你轻松选型,搞定消息分发与复杂路由
RabbitMQ 是消息队列中的主流方案。这篇讲 SpringBoot 整合 RabbitMQ 的五种消息模型。
一、引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>二、配置
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest三、工作队列模式(Work Queue)
@Configuration
public class RabbitConfig {
public static final String QUEUE = "queue.work";
@Bean
public Queue workQueue() {
return new Queue(QUEUE);
}
}
@Service
public class WorkProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
public void send(String message) {
for (int i = 0; i < 10; i++) {
rabbitTemplate.convertAndSend(RabbitConfig.QUEUE, message + ":" + i);
}
}
}
@Component
public class WorkConsumer1 {
@RabbitListener(queues = RabbitConfig.QUEUE)
public void receive(String message) {
System.out.println("消费者1收到: " + message);
try { Thread.sleep(1000); } catch (Exception e) {}
}
}
四、发布订阅模式(Publish/Subscribe)
@Configuration
public class FanoutConfig {
@Bean
public FanoutExchange fanoutExchange() {
return new FanoutExchange("exchange.fanout");
}
@Bean
public Queue queueA() { return new Queue("queue.fanout.a"); }
@Bean
public Queue queueB() { return new Queue("queue.fanout.b"); }
@Bean
public Binding bindingA() {
return BindingBuilder.bind(queueA()).to(fanoutExchange());
}
@Bean
public Binding bindingB() {
return BindingBuilder.bind(queueB()).to(fanoutExchange());
}
}
五、路由模式(Routing)
@Configuration
public class DirectConfig {
public static final String QUEUE_INFO = "queue.direct.info";
public static final String QUEUE_ERROR = "queue.direct.error";
@Bean
public DirectExchange directExchange() {
return new DirectExchange("exchange.direct");
}
@Bean
public Queue infoQueue() { return new Queue(QUEUE_INFO); }
@Bean
public Queue errorQueue() { return new Queue(QUEUE_ERROR); }
@Bean
public Binding infoBinding() {
return BindingBuilder.bind(infoQueue()).to(directExchange()).with("info");
}
@Bean
public Binding errorBinding() {
return BindingBuilder.bind(errorQueue()).to(directExchange()).with("error");
}
}
@Service
public class DirectProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendError(String message) {
// 只有 errorQueue 会收到
rabbitTemplate.convertAndSend("exchange.direct", "error", message);
}
}
六、主题模式(Topic)
@Configuration
public class TopicConfig {
@Bean
public TopicExchange topicExchange() {
return new TopicExchange("exchange.topic");
}
@Bean
public Queue orderQueue() { return new Queue("queue.topic.order"); }
@Bean
public Queue userQueue() { return new Queue("queue.topic.user"); }
@Bean
public Binding orderBinding() {
return BindingBuilder.bind(orderQueue()).to(topicExchange())
.with("order.*");
}
@Bean
public Binding userBinding() {
return BindingBuilder.bind(userQueue()).to(topicExchange())
.with("user.#");
}
}
七、五种模型对比
| 模型 | Exchange类型 | 路由方式 | 场景 |
|---|---|---|---|
| 简单/工作 | 无(默认) | 直接 | 任务分发 |
| 发布订阅 | Fanout | 广播 | 通知所有消费者 |
| 路由 | Direct | 精确匹配 | 按级别分发 |
| 主题 | Topic | 通配符 | 复杂路由 |
| RPC | 无 | 同步 | 请求-响应 |
到此这篇关于SpringBoot整合RabbitMQ五种消息模型的实战教学的文章就介绍到这了,更多相关SpringBoot RabbitMQ消息模型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
