本文讲解TopicExchange
主题交换机,这个交换机其实跟直连交换机流程差不多,但是它的特点就是在它的路由键和绑定键之间是有规则的。
简单地介绍下规则:
*(星号) 用来表示一个单词 (必须出现的)
#(井号) 用来表示任意数量(零个或多个)单词
通配的绑定键是跟队列进行绑定的,举例如下:
队列Q1 绑定键为 .TT.
队列Q2绑定键为 TT.#
如果一条消息携带的路由键为 A.TT.B,那么队列Q1将会收到;
如果一条消息携带的路由键为TT.AA.BB,那么队列Q2将会收到;
1.在发布者publisher服务中向交换机发送消息
交换机名称是badianboke.topic
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringAmqpTest {
//发送到交换机
@Test
public void testSendDirectExchange(){
String exchangeName = "badianboke.topic";
String message = "hello badianboke.com";
rabbitTemplate.convertAndSend(exchangeName, "chian.badian", message);
}
}
2.在消费者consumer服务中监听两个队列并接收消息
cn/badianboke/mq/listener/SpringRabbitListener.java
package cn.badianboke.mq.listener;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.time.LocalTime;
@Component
public class SpringRabbitListener {
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "direct.queue1"),
exchange = @Exchange(name = "badianboke.topic", type = ExchangeTypes.TOPIC),
key = {"red", "blue"}
))
public void listenTopicQueue1(String message){
System.err.println("Consumer1 Received topic.queue1 Message: " + message + " / " + LocalTime.now());
}
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "direct.queue2"),
exchange = @Exchange(name = "badianboke.topic", type = ExchangeTypes.TOPIC),
key = {"red", "yellow"}
))
public void listenTopicQueue2(String message){
System.err.println("Consumer2 Received direct.queue2 Message: " + message + " / " + LocalTime.now());
}
}
打开RabbitMq控制台,可以看到
一个交换机badianboke.direct
两个队列direct.queue1
和direct.queue2
绑定关系