备份交换器(Alternate Exchange)
2020-11-18 本文已影响0人
于情于你
上一节mandatory和immediate,说生产者在发送消息的时候如果不设置 mandatory 参数,那么消息在未被路由的情况下将会丢失,如果设置了 mandatory 参数,那么需要添加 ReturnListener 的编程逻辑。如果既不想复杂化生产者的编程逻辑,又不想消息丢失,那么可以使用备份交换器。
可以通过在声明交换器(调用 channel.exchangeDeclare 方法)的时候添加alternate-exchange 参数来实现。
Map<String, Object> args = new HashMap<String, Object>();
args.put("alternate-exchange", "myAe");
channel.exchangeDeclare("normalExchange ", "direct", true, false, args);
channel.exchangeDeclare("myAe", "fanout", true, false, null);
channel.queueDeclare("normalQueue ", true, false, false, null);
channel.queueBind("normalQueue", "normalExchange","normalKey");
channel.queueDeclare("unroutedQueue", true, false, false, null);
channel.queueBind ("unroutedQueue","myAe","");

为防止消息丢失建议将备份交换器设置为fanout类型。
如果设置的备份交换器不存在,客户端和RabbitMQ服务端都不会有异常出现,此时消息会丢失。
如果备份交换器没有绑定任何队列,客户端和RabbitMQ服务端都不会有异常出现,此时消息会丢失。
如果备份交换器没有任何匹配的队列,客户端和 RabbitMQ 服务端都不会有异常出现,此时消息会丢失。
如果备份交换器和mandatory 参数一起使用,那么mandatory 参数无效。