使用
channel.basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicProperties props, byte[] body)
参数意义
mandatory(消息发送到交换机后,交换机找不到合适的队列转发消息)
true,则退回给发送者,channel.addReturnListener来监听退回的信息
false,直接丢弃消息
immediate(消息发送到队列上,但是匹配的所有队列都没有消费者时候)
true,则退回给发送者
false,直接丢弃消息
注意:因为性能问题,3.0版本去掉了immediate参数的支持
可以用备份交换机(alternate exchange来代替mandatory参数)
简单理解:消息发送到交换机后,交换机找不到合适的队列转发消息,则转发给备份交换机,继而存入备份交换机绑定的队列中;
步骤:
声明一个fanout类型交换机
channel.exchangeDeclare( "ae-demo" , "fanout" , true , false , null) ;
声明一个队列并绑定到fanout交换机上
channel.queueDeclare( "unroutedQueue " , true , false , false , null);
channel.queueBind("unroutedQueue", "ae-demo", "");
通过参数alternate-exchange声明交换机,注册备份交换机
Map<String,Object> args = new HashMap<String,Object>();
args.put("alternate-exchange","ae-demo"");
channel.exchangeDeclare( "normalExchange" , " direct" , true , false , args);
channel.queueDeclare( "normalQueue " , true , false , false , null);
channel.queueBind("normalQueue ", "normalExchange", "normalkey");
为了方便使用才把备份交换机设置成fanout类型,否则,也要按照routingkey的规则去匹配,否则消息一样会丢失
*备份交换机和mandatory参数一起使用,会导致mandatory无效;
*还有Policy方式定义备份交换机