专栏导航
目录
RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了交换机在RabbitMQ中的作用与类型、交换机案例(Fanout交换机、Direct交换机、Topic交换机)等内容。
在RabbitMQ中,交换机是一个核心组件,它起到了连接生产者、队列和交换机之间的桥梁作用。交换机的存在改变了消息发送的模式,它接收生产者的消息,并根据特定的路由规则,将消息转发到相应的队列。
案例模型:
交换机的类型:
Fanout交换机
Direct交换机
Topic交换机
Headers交换机
交换机的选择和使用:
在选择和使用交换机时,需要根据业务需求和场景来决定使用哪种类型的交换机。如果需要将消息广播给所有相关的队列,那么Fanout交换机是一个很好的选择。如果需要根据特定的RoutingKey将消息发送给特定的队列,那么Direct或Topic交换机是合适的选择。而Headers交换机由于其较少的使用场景和特定的行为,通常在特定的情况下才会使用。
案例模型:
在RabbitMQ管理控制台新建两个队列:
查看新建结果:
新建一个交换机,选择fanout类型:
查看新建结果:
绑定两个队列到交换机:
查看绑定结果:
在publisher服务中的测试类添加一个测试方法,实现消息发送:
@Test
void testSendFanout() {
String exchangeName = "demo.fanout";
String msg = "Fanout Exchange test";
rabbitTemplate.convertAndSend(exchangeName, null, msg);
}
在consumer服务的类中添加2个新的方法,作为消费者:
@RabbitListener(queues = "fanout1.queue")
public void listenFanoutQueue1(String msg) {
System.out.println("fanout1:" + msg);
}
@RabbitListener(queues = "fanout2.queue")
public void listenFanoutQueue2(String msg) {
System.out.println("fanout2" + msg);
}
运行结果:
案例模型:
在Direct模型中,消息并不是被发送到所有绑定的队列,而是基于一个特定的路由键(RoutingKey)来决定其目的地。这种模型的好处是提供了更高的灵活性和控制性。通过使用不同的RoutingKey,可以将消息发送到特定的队列,从而实现更复杂的消息处理逻辑。
RoutingKey
。这个RoutingKey
可以被看作是决定消息路由的“标签”或“地址”。RoutingKey
。这个RoutingKey
代表了消息的预期目的地或类别。RoutingKey
,并与绑定时设置的RoutingKey
进行比较。只有当队列的RoutingKey
与消息的RoutingKey
完全匹配时,该队列才会接收到这个消息。在RabbitMQ管理控制台新建两个队列:
查看新建结果:
新建一个交换机,选择direct类型:
查看新建结果:
绑定两个队列到交换机,指定RoutingKey:
查看绑定结果:
?
在consumer服务的类中添加2个新的方法,作为消费者进行消息接收:
@RabbitListener(queues = "direct1.queue")
public void listenDirectQueue1(String msg) {
System.out.println("direct1:" + msg);
}
@RabbitListener(queues = "direct2.queue")
public void listenDirectQueue2(String msg) {
System.out.println("direct2:" + msg);
}
在publisher服务中的测试类添加一个测试方法,设置RoutingKey为red,实现消息发送:
@Test
public void testSendDirectExchange() {
// 交换机名称
String exchangeName = "demo.direct";
// 消息
String message = "Direct Exchange Red test";
// 发送消息
rabbitTemplate.convertAndSend(exchangeName, "red", message);
}
运行结果:
在publisher服务中的测试类修改测试方法,设置RoutingKey为blue:
@Test
public void testSendDirectExchange() {
// 交换机名称
String exchangeName = "demo.direct";
// 消息
String message = "Direct Exchange Red test";
// 发送消息
rabbitTemplate.convertAndSend(exchangeName, "blue", message);
}
运行结果(只有消费者1收到了消息 ):
案例模型:
在RabbitMQ的Topic模型中,消息的路由规则更加灵活和高级。与Direct模型不同,Topic模型允许使用通配符来进行路由键匹配。通过使用通配符,可以匹配多个队列,从而实现更复杂的消息处理逻辑。
RoutingKey
。然而,这个RoutingKey
可以包含通配符,以提供更广泛的匹配选项。RoutingKey
。这个RoutingKey
可以包含通配符,以便在多个队列之间进行匹配。RoutingKey
,并与绑定时设置的RoutingKey
进行比较。如果消息的RoutingKey
与队列的RoutingKey
匹配(包括使用通配符进行匹配),则该队列会接收到这个消息。在RabbitMQ管理控制台新建两个队列:
查看新建结果:
新建一个交换机,选择Topic类型:
查看新建结果:
绑定两个队列到交换机,指定RoutingKey:
查看绑定结果:
在consumer服务的类中添加2个新的方法,作为消费者进行消息接收:
@RabbitListener(queues = "topic1.queue")
public void listenTopicQueue1(String msg) throws InterruptedException {
System.out.println("topic1:" + msg);
}
@RabbitListener(queues = "topic2.queue")
public void listenTopicQueue2(String msg) throws InterruptedException {
System.out.println("topic1:" + msg);
}
在publisher服务中的测试类添加一个测试方法,设置RoutingKey为china.news,实现消息发送:
@Test
void testSendTopic() {
String exchangeName = "demo.topic";
String msg = "Topic Exchange test1";
rabbitTemplate.convertAndSend(exchangeName, "china.news", msg);
}
运行结果:
在publisher服务中的测试类修改测试方法,设置RoutingKey为china.date:
@Test
void testSendTopic() {
String exchangeName = "demo.topic";
String msg = "Topic Exchange test";
rabbitTemplate.convertAndSend(exchangeName, "china.date", msg);
}
运行结果(只有消费者1收到了消息 ):
RabbitMQ是一个开源的消息队列软件,旨在提供可靠的消息传递和消息队列功能。本文主要介绍了交换机在RabbitMQ中的作用与类型、交换机案例(Fanout交换机、Direct交换机、Topic交换机)等内容,希望对大家有所帮助。