RabbitMq的路由模式-Direct:
在广播模式下一条消息可以被所有的服务进行消费,但是有的时候,我们希望不通的消息被不同的队列消费,这个时候就需要用到driect的exchange了
实现步骤:
第一步:项目准备
消息生产方: zt-frank-mq-prod-service-9501
消息消费方1:zt-frank-mq-consumer1-service-9505
消息消费方2:zt-frank-mq-consumer2-service-9506
第二步:消息生产者9501代码编写,向driect类型的exchange发送三次消息,但是每次消息的routingKey不一样
@Controller
@RequestMapping("/mq")
public class RouterModel_4 {
private static Logger logger = Logger.getLogger(RouterModel_4.class);
@Autowired
private RabbitTemplate rabbitTemplate;
@PostMapping("/router")
@ResponseBody
public String test(){
logger.info("mq开始生成消息-路由模式");
ArrayList<String> arr = new ArrayList<>();
arr.add("info");
arr.add("warn");
arr.add("error");
/**
* 需要有消费者才能创建exchange,也就是说队列和交换机的创建取决与消费者
* 参数1:exchange名称
* 参数2: routingKey 路由的名字 (在广播模式下没有意义给个空字符串)
* 参数3:要发送消息的内容
*/
for (String routerName: arr){
rabbitTemplate.convertAndSend("routerExchange",routerName,"routing--路由模式 routerName= "+routerName);
}
logger.info("mq生成消息结束-路由模式");
return "OK";
}
}
第三步:消费方服务9505代码编写,在@QueueBinding注解上绑定队列和exchange的时候指明了路由为error的路由
@Component
public class RouterModelListener_4 {
private static Logger logger = Logger.getLogger(RouterModelListener_4.class);
@RabbitListener(bindings = {
@QueueBinding( //exchange与队列的绑定
value = @Queue, //创建临时队列
exchange = @Exchange(value = "routerExchange",type = "direct"), //指定exchange的名称和类型
key = {"error"} //只处理路由名称为error 的消息
)
})
public void routerModel(String message){
logger.info("开始消费消息-路由模式");
System.out.println("MQ消费消息9505:"+message);
logger.info("结束消费消息-路由模式");
}
第四步:消费方服务9506代码编写,在@QueueBinding注解上绑定队列和exchange的时候指明了路由为info/warn的路由
@Component
public class RouterModelListener_4 {
private static Logger logger = Logger.getLogger(RouterModelListener_4.class);
@RabbitListener(bindings = {
@QueueBinding( //exchange与队列的绑定
value = @Queue, //创建临时队列
exchange = @Exchange(value = "routerExchange",type = "direct"), //指定exchange的名称和类型
key = {"info","warn"} //只处理路由名称为info和warn的消息
)
})
public void routerModel(String message){
logger.info("开始消费消息-路由模式");
System.out.println("MQ消费消息9506:"+message);
logger.info("结束消费消息-路由模式");
}
}
第四步:测试,期望消费服务9505打印路由名为error的,而9506服务则打印info和warn的;
9505日志:
开始消费消息-路由模式
MQ消费消息9505:routing--路由模式 routerName= error
结束消费消息-路由模式
9506日志:
开始消费消息-路由模式
MQ消费消息9506:routing--路由模式 routerName= info
MQ消费消息9506:routing--路由模式 routerName= warn
结束消费消息-路由模式
结果复合预期效果;