全面解析RabbitMQ交换机的工作机制及其实际运用" - 2. 实际案例中的RabbitMQ交换机应用
最编程
2024-01-27 18:58:42
...
2.1直连交换机实践
创建好队列与交换机,并且绑定
@Bean
public Queue queue1(){
return new Queue("queue1");
}
@Bean
public Queue queue2(){
return new Queue("queue2");
}
@Bean
public DirectExchange drectexchange(){
return new DirectExchange("drectexchange");
}
@Bean
public Binding bingding1(){
return BindingBuilder.bind(queue1()).to(drectexchange()).with("a");
}
@Bean
public Binding bingding2(){
return BindingBuilder.bind(queue2()).to(drectexchange()).with("b");
}
生产者方法
@RequestMapping("/send3")
public String send3(){
//向消息队列发送消息
amqpTemplate.convertAndSend("drectexchange","a","hello");
return "哈哈;";
}
消费者监听
package com.example.consumer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "queue1")
public class ReceiverQ1 {
@RabbitHandler
public void process(String msg) {
log.warn("Q1接收到:" + msg);
}
}
package com.example.consumer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "queue2")
public class ReceiverQ2 {
@RabbitHandler
public void process(String msg) {
log.warn("Q2接收到:" + msg);
}
}
运行一遍send3方法
2.2 主题交换机实践
前提准备,打开RabbitMQ服务,参考 构建高可用消息队列系统 01
进入实战
创建好队列与交换机,并且绑定
@Bean
public TopicExchange topicExchange(){
return new TopicExchange("topicExchange");
}
@Bean
public Binding bingding3(){
return BindingBuilder.bind(queue1()).to(topicExchange()).with("*.*.a");
}
@Bean
public Binding bingding4(){
return BindingBuilder.bind(queue2()).to(topicExchange()).with("*.*.b");
}
@Bean
public Binding bingding5(){
return BindingBuilder.bind(queue1()).to(topicExchange()).with("mq.#");
}
@Bean
public Binding bingding6(){
return BindingBuilder.bind(queue2()).to(topicExchange()).with("mq.#");
}
生产者方法
@RequestMapping("/send4")
public String send4(String rex){
//向消息队列发送消息
amqpTemplate.convertAndSend("topicExchange",rex,"hello");
return "哈哈;";
}
消费者监听在直连交换机上有
测试1
测试2
测试3
mq打头
2.3 扇形交换机实践
创建好队列与交换机,并且绑定
@Bean
public FanoutExchange fanoutExchange(){
return new FanoutExchange("fanoutExchange");
}
@Bean
public Binding bingding7(){
return BindingBuilder.bind(queue1()).to(fanoutExchange());
}
@Bean
public Binding bingding8(){
return BindingBuilder.bind(queue2()).to(fanoutExchange());
}
生产者方法
生产者调用convertAndSend时第二个参数必须要有,可以给null值,否则报错
@RequestMapping("/send5")
public String send5(){
//向消息队列发送消息
amqpTemplate.convertAndSend("fanoutExchange","","hello");
return "哈哈;";
}
消费者监听在直连交换机上有
测试