一.Topic Exchange
Topic 是 RabbitMQ 中最灵活的一种方式,可以根据 routing_key 自由的绑定不同的队列。
1)首先添加交换机

首先对 Topic 规则配置,这里使用两个队列来测试。
注意:配置路由键的时候可以配置 *, # 来模糊匹配。以下配置是让 queueMessages 同时匹配两个队列,queueMessage 只匹 配“topic.message”队列
@Configuration
public class TopicRabbitConfig {
final static String message = "topic.message";
final static String messages = "topic.messages";
//定义队列
@Bean
public Queue queueMessage() {
return new Queue(TopicRabbitConfig.message);
}
@Bean
public Queue queueMessages() {
return new Queue(TopicRabbitConfig.messages);
}
//交换机
@Bean
TopicExchange exchange() {
return new TopicExchange("exchange");
}
//将队列和交换机绑定
@Bean
Binding bindingExchangeMessage(Queue queueMessage, TopicExchange exchange) {
return BindingBuilder.bind(queueMessage).to(exchange).with("topic.message");
}
@Bean
Binding bindingExchangeMessages(Queue queueMessages, TopicExchange exchange) {
return BindingBuilder.bind(queueMessages).to(exchange).with("topic.#");
}
}
发送者代码:
@Component
public class TopicSender {
@Autowired
private AmqpTemplate rabbitTemplate;
public void send1() {
String context = "Topic Sender1 topic.message";
System.out.println("Sender : " + context);
this.rabbitTemplate.convertAndSend("exchange", "topic.message", context);
}
public void send2() {
String context = "Topic Sender2 topic.messages";
System.out.println("Sender : " + context);
this.rabbitTemplate.convertAndSend("exchange", "topic.messages", context);
}
}
定义接收者1(TopicReceiver) 和接收者2(TopicReceiver2)
@Component
@RabbitListener(queues = "topic.message")
public class TopicReceiver {
@RabbitHandler
public void process(String message) {
System.out.println("Topic Receiver1 : " + message);
}
}
@Component
@RabbitListener(queues = "topic.#")
public class TopicReceiver2 {
@RabbitHandler
public void process(String message) {
System.out.println("Topic Receiver2 : " + message);
}
}
测试seng1:
@Test
public void topicTest() throws Exception {
topicSender.send1();
Thread.sleep(1000l);
}
结果:(两个都接收到)

测试send2:
@Test
public void topic2() throws Exception {
topicSender.send2();
Thread.sleep(1000l);
}
结果:()

发送 send1 会匹配到 topic.# 和 topic.message 两个 Receiver 都可以收到消息。
发送 send2 只有 topic.# 可以匹配,Receiver2 监听到了消息。
二.Fanout Exchange
Fanout 就是我们熟悉的广播模式或者订阅模式,给 Fanout 交换机发送消息,绑定了这个交换机的所有队列都收到这个消息。
新建type为Fanout的交换机,添加序列

配置FanoutRabbitConfig
@Configuration
public class FanoutRabbitConfig {
//定义队列
@Bean
public Queue AMessage() {
return new Queue("fanout.A");
}
@Bean
public Queue BMessage() {
return new Queue("fanout.B");
}
@Bean
public Queue CMessage() {
return new Queue("fanout.C");
}
//定义交换机
@Bean
FanoutExchange fanoutExchange() {
return new FanoutExchange("fanoutExchange");
}
//分部进行绑定
@Bean
Binding bindingExchangeA(Queue AMessage, FanoutExchange fanoutExchange) {
return BindingBuilder.bind(AMessage).to(fanoutExchange);
}
@Bean
Binding bindingExchangeB(Queue BMessage, FanoutExchange fanoutExchange) {
return BindingBuilder.bind(BMessage).to(fanoutExchange);
}
@Bean
Binding bindingExchangeC(Queue CMessage, FanoutExchange fanoutExchange) {
return BindingBuilder.bind(CMessage).to(fanoutExchange);
}
}
新加发送者代码
@Component
public class FanoutSender {
@Autowired
private AmqpTemplate rabbitTemplate;
public void send() {
String context = "FanoutSender";
System.out.println("Sender : " + context);
this.rabbitTemplate.convertAndSend("fanoutExchange","", context);
}
}
接收者代码A,B,C
@Component
@RabbitListener(queues = "fanout.A")
public class FanoutReceiverA {
@RabbitHandler
public void process(String message) {
System.out.println("fanout Receiver A: " + message);
}
}
@Component
@RabbitListener(queues = "fanout.B")
public class FanoutReceiverB {
@RabbitHandler
public void process(String message) {
System.out.println("fanout Receiver B: " + message);
}
}
@Component
@RabbitListener(queues = "fanout.C")
public class FanoutReceiverC {
@RabbitHandler
public void process(String message) {
System.out.println("fanout Receiver C: " + message);
}
}
测试send()
@Test
public void fanoutSender() throws Exception {
fanoutSender.send();
Thread.sleep(1000l);
}
运行结果如下:

结果说明,绑定到 fanout 交换机上面的队列都收到了消息。
1492

被折叠的 条评论
为什么被折叠?



