主题交换机(Topic Exchange)
异步处理的流程
1.队列与交换机的绑定
package com.zking.provider.config;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration//代替xml配置文件
public class RabbitmqTopicConfig {
@Bean//<bean id="directQueue1"></bean>
public Queue topicQueue1() {//创建一个队列
return new Queue("topicQueue1", true);//true 持久化消息
}
@Bean//<bean id="directQueue1"></bean>
public Queue topicQueue2() {//创建一个队列
return new Queue("topicQueue2", true);//true 持久化消息
}
@Bean
public TopicExchange topicExchange1(){//创建一个交换机
return new TopicExchange("topicExchange1");
}
//user.email 匹配user.*
//user.* user.letter 也能匹配
@Bean
public Binding BindingTopicQueue1 (){
return BindingBuilder.bind(topicQueue1()).to(topicExchange1()).with("user.*");
}
@Bean
public Binding BindingTopicQueue2 (){
return BindingBuilder.bind(topicQueue2()).to(topicExchange1()).with("user.letter");
}
}
2.向队列发送消息
@GetMapping("/send2")
@ResponseBody
public String send2(String uid,String routingKey) {
System.out.println("uid为"+uid+"的用户注册成功");
Map<String, Object> map = getMap();
map.put("uid",uid);
rabbitTemplate.convertAndSend("topicExchange1", routingKey, map);
// rabbitTemplate.convertAndSend("directExchange1", routingKey, map);
return "ok";
}
package com.zking.consumer.mq;
import org.apache.commons.logging.Log;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
@RabbitListener(queues = "topicQueue1")
public class TopicEmailReceiver {
//处理消息
@RabbitHandler
public void process(Map map) {
String uid=(String) map.get("uid");
System.out.println("向用户uid为: "+uid+"的用户发送邮件");
}
}
@Component
@RabbitListener(queues = "topicQueue2")
public class TopicEmailReceiver {
//处理消息
@RabbitHandler
public void process(Map map) {
String uid=(String) map.get("uid");
System.out.println("向用户uid为: "+uid+"的用户发送短信");
}
}
测试图
扇形交换机
1.交换机与对列的绑定
package com.zking.provider.config;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration//代替xml配置文件
public class RabbitmqFanoutConfig {
@Bean//<bean id="directQueue1"></bean>
public Queue fanoutQueue1() {//创建一个队列
return new Queue("fanoutQueue1", true);//true 持久化消息
}
@Bean//<bean id="directQueue1"></bean>
public Queue fanoutQueue2() {//创建一个队列
return new Queue("fanoutQueue2", true);//true 持久化消息
}
@Bean//<bean id="directQueue1"></bean>
public Queue fanoutQueue3() {//创建一个队列
return new Queue("fanoutQueue3", true);//true 持久化消息
}
@Bean
public FanoutExchange fanoutExchange1(){//创建一个交换机
return new FanoutExchange("fanoutExchange1");
}
//user.email 匹配user.*
//user.* user.letter 也能匹配
@Bean
public Binding BindingFanoutQueue1 (){
return BindingBuilder.bind(fanoutQueue1()).to(fanoutExchange1());
}
@Bean
public Binding BindingFanoutQueue2 (){
return BindingBuilder.bind(fanoutQueue2()).to(fanoutExchange1());
}
@Bean
public Binding BindingFanoutQueue3(){
return BindingBuilder.bind(fanoutQueue3()).to(fanoutExchange1());
}
}
2.像队列发送消息
@GetMapping("/send3")
public String send3() {
Map<String, Object> map = getMap();
rabbitTemplate.convertAndSend("fanoutExchange1",null, map);
// rabbitTemplate.convertAndSend("directExchange1", routingKey, map);
return "ok";
}
3、消费者消费消息
//同上交换机一致,就修改队列名
总结
1.交换机与队列的基本工作流程
2.三种交换机的区别
2.1直连交换机与主题交换机区别在于直连交换机不能有像主题交换机有复杂的路由键(区别看异步处理代码)
2.2而扇形交换机无路由键