在RabbitMQ中,我们并不知道该如何处理这些无法路由的消息,最多打个日志,然后触发报警,再来手动处理。而通过日志来处理这些无法路由的消息很不优雅,特别是所在的服务器有多台机器的时候。所以这里就可以使用备份交换机来把这些无法路由的消息全部放到备份交换机的备份队列里面。
代码架构图:
配置类代码如下所示:
@Configuration
public class ConfirmConfig {
//交换机名称
public static final String CONFIRM_EXCHANGE_NAME
= "confirm_exchange123";
//队列名称
public static final String CONFIRM_QUEUE_NAME
= "confirm_queue";
//RoutingKey
public static final String CONFIRM_ROUTING_KEY
= "key1";
//备份交换机
public static final String BACKUP_EXCHANGE_NAME = "backup_exchange";
//备份队列
public static final String BACKUP_QUEUE_NAME = "backup_queue";
public static final String WARNING_QUEUE_NAME = "warning_queue";
//交换机声明
@Bean("confirmExchange")
public DirectExchange confirmExchange(){
return ExchangeBuilder.directExchange(CONFIRM_EXCHANGE_NAME).
durable(true).withArgument("alternate-exchange",BACKUP_EXCHANGE_NAME).build();
// return new DirectExchange(CONFIRM_EXCHANGE_NAME);
}
//队列声明
@Bean("confirmQueue")
public Queue confirmQueue(){
return new Queue(CONFIRM_QUEUE_NAME);
}
@Bean
//绑定
public Binding queueBindingExchange(@Qualifier("confirmExchange")DirectExchange confirmExchange,@Qualifier("confirmQueue") Queue confirmQueue){
return BindingBuilder.bind(confirmQueue).to(confirmExchange).with(CONFIRM_ROUTING_KEY);
}
@Bean("backExchange")
public FanoutExchange backExchange(){
return new FanoutExchange(BACKUP_EXCHANGE_NAME);
}
//队列声明
@Bean("backupQueue")
public Queue backupQueue(){
return new Queue(BACKUP_QUEUE_NAME);
}
@Bean("warningQueue")
public Queue warningQueue(){
return new Queue(WARNING_QUEUE_NAME);
}
@Bean
public Binding backupQueueBindingBackExchange(@Qualifier("backExchange")FanoutExchange backExchange, @Qualifier("backupQueue")Queue backupQueue){
return BindingBuilder.bind(backupQueue).to(backExchange);
}
@Bean
public Binding warningQueueBindingBackExchange(@Qualifier("backExchange")FanoutExchange backExchange, @Qualifier("warningQueue")Queue warningQueue){
return BindingBuilder.bind(warningQueue).to(backExchange);
}
}