SpringBoot整合RabbitMQ的Routing
上一章我们用RabbitMQ的Fanout消息订阅模式,能够把消息发给每一个订阅者。
这一章在以日志系统为例,定义以下两个队列,通过Routing来实现需求。
error队列:接收error消息
log队列:接收error消息和info消息
交换机配置
@Configuration
class ExchangeConfig{
/**
* directExchange: 直连交换机
* durable:持久化
* @return
*/
@Bean
public Exchange exchange() {
return ExchangeBuilder.directExchange("USER_DIRECT").durable(true).build();
}
@Bean
public Queue errorQueue() {
return new Queue("errorQueue");
}
@Bean
public Queue infoQueue() {
return new Queue("logQueue");
}
@Bean
public Binding bindingDirectExchange1(Queue errorQueue, Exchange exchange) {
return BindingBuilder.bind(errorQueue).to(exchange).with("error_routing").noargs();
}
@Bean
public Binding bindingDirectExchange2(Queue infoQueue, Exchange exchange) {
return BindingBuilder.bind(infoQueue).to(exchange).with("info_routing").noargs();
}
@Bean
public Binding bindingDirectExchange3(Queue infoQueue, Exchange exchange) {
return BindingBuilder.bind(infoQueue).to(exchange).with("error_routing").noargs();
}
}
消费者
@Component
@RabbitListener(queues = "errorQueue")
class ErrorQueueConsumer{
@RabbitHandler
public void receive(String msg){
System.out.println("ERROR:" + msg);
}
}
@Component
@RabbitListener(queues = "logQueue")
class LogQueueConsumer{
@RabbitHandler
public void receive(String msg){
System.out.println("LOG:" + msg);
}
}
生产者
@RestController
@RequestMapping("/routing")
public class RoutingUserCtrl {
@Autowired
private AmqpTemplate amqpTemplate;
/***
* 定义两个队列:
* error队列:接收error消息
* log队列:接收error消息和info消息
* @param msg
* @return
*/
@GetMapping("/addUser")
public String addUser(String msg){
String exchange = "USER_DIRECT";
amqpTemplate.convertAndSend(exchange, "error_routing", "接口异常");
amqpTemplate.convertAndSend(exchange, "info_routing", "terry操作成功");
return msg;
}
}
运行,可以看到logQueue绑定了两个routing_key
运行打印输出: