备份交换器,Alternate Exchange,简称AE,也叫做“备胎交换器”。
生产者在发送消息的时候,如果不设置mantatory参数,那么消息在未被路由的情况下将会丢失,如果设置了mantatory参数,则需要编写ReturnListener进行监听,对basicReturn的消息进行处理,但是这样会增加代码的复杂程度。
我们可以使用备份交换器,将未被路由的消息存储在RabbitMQ中,然后在需要的时候去处理这些消息。
Map<String,Object> args=new HashMap<>();
args.put("alternate-exchange","AE1");
channel.exchangeDeclare("AE", "direct",true,false,args);
channel.exchangeDeclare("AE1","fanout",true,false,null);
channel.queueDeclare("normal",true,false,false,null);
channel.queueDeclare("unrout",true,false,false,null);
channel.queueBind("normal","AE","normalKey");
channel.queueBind("unrout","AE1","");
以上代码声明了两个交换器AE、AE1,AE1为AE的备份交换器。并且声明了两个队列,normal和unrout,将AE和normal绑定,将unrout和AE1绑定。
此时,生产者发送一条消息到exchange上,当路由键等于normalKey的时候,路由能够将消息路由到normal队列中,但是如果此时,路由键为其他值,则消息会发送到备份交换器AE1,进而发送到AE1绑定的unrout队列上。
注意:消息被重新发送到备份交换器时的路由键和从生产者发出时候的路由键是一样的。一般备份交换器的类型设置为fanout。如果备份交换器的类型是direct,并且有一个与他绑定的队列,假设绑定的路由键是key1,某条携带路由键是key2的消息被转发到备份交换器的时候,备份交换器不能匹配到合适的队列,消息会丢失。
网友评论