一、RabbitMQ"路由模式"简介
RabbitMQ有七种队列模型,"简单队列"、"工作队列"、"发布订阅"、"路由模式"、"主题模式"、"RPC模式"、"发布者确认模式"。
官网地址:https://www.rabbitmq.com/getstarted.html
路由模式:

相较于"简单队列","路由模式"增加了交换机(图中紫色的X),生产者生产的消息不会直接进入到队列中,而是先将消息发送到了交换机,再由交换机转发到相应的队列中。一个队列可以有多个消费者,但发送到队列的消息只能被其中一个消费。
在7种队列模式中,同样用到交换机的还有"发布订阅"、"主题模式"。不同队列模式的交换机的类型是不一样的,"路由模式"的交换机类型为direct,"发布订阅"的交换机类型为fanout,"主题模式"的交换机类型为topic。
在"路由模式"种,交换机和队列要进行绑定,会有一个Binding key,发送消息是要指定交换机,和一个Routing key,当Binding key和Routing key相同的时候,交换机才会把消息发送到对应的队列中,如果没有匹配上的队列,交换机会将消息抛弃。

交换机支持多重绑定,不同的队列可以用相同的Binding key与同一交换机绑定,发送消息时向每个匹配上的队列中发送消息。

相同的队列可以用不同的Binding key与同一交换机绑定,发送消息时向每个匹配上的队列中发送消息。
二、"路由模式"代码的实现
2.1 引入jar包
<!-- rabbitmq依赖 strat-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!-- rabbitmq依赖 end-->2.2 RabbitMQ配置文件
创建队列,创建交换机,交换机与队列绑定。
@Configuration
public class RabbitConfig {
/**
* 创建2个队列
**/
@Bean
public Queue fruitsQueue(){
return new Queue("fruits_queue");
}
@Bean
public Queue meatQueue(){
return new Queue("meat_queue");
}
/**
* 声明一个Direct类型的交换机
**/
@Bean
DirectExchange directExchange(){
return new DirectExchange("xue_exchange");
}
/**
* 将上面的2个队列绑定到Direct交换机,在绑定的时候指定BindingKey
**/
@Bean
Binding bindExchangeFruits(Queue fruitsQueue, DirectExchange directExchange){
return BindingBuilder.bind(fruitsQueue).to(directExchange).with("fruits");
}
@Bean
Binding bindExchangeMeat(Queue meatQueue,DirectExchange directExchange){
return BindingBuilder.bind(meatQueue).to(directExchange).with("meat");
}
}2.3 生产者
@Component
public class Publisher {
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* 生产者将消息发送到Direct交换机,发送的时候携带RoutingKey
**/
public void sendMessage() {
String message = "apple";
System.out.println("发送消息 : " + message);
//convertAndSend(交换机名称,交换机和队列之间绑定的key,routingKey,消息)
rabbitTemplate.convertAndSend("xue_exchange","fruits",message);
}
}2.4 消费者
@Component
public class Consumer {
@RabbitListener(queues = "fruits_queue")
@RabbitHandler
public void processA(String message) {
System.out.println("消息路由到了队列fruits_queue: " + message);
}
@RabbitListener(queues = "meat_queue")
@RabbitHandler
public void processB1(String message) {
System.out.println("消息路由到了队列meat_queue: " + message);
}
}2.5 测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class FirstprojectApplicationTests {
@Autowired
Publisher publisher;
@Test
public void contextLoads() {
publisher.sendMessage();
}
}
版权声明:本文为weixin_40877388原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。