mandatory和immediate是 channel.basicPublish方法中的两个参数,它们都有当消息传递过程中不可达目的地时将消息返回给生产者的功能。
mandatory
当mandatory参数设为true 时,交换器无法根据自身的类型和路由键找到一个符合条件的队列,那么RabbitMQ会调用Basic.Return命令将消息返回给生产者。当mandatory参数设置为 false 时,出现上述情形,则消息直接被丢弃。
生产者可以通过调用,channel.addReturnListener来添加ReturnListener监听器实现。
channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, false, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
channel.addReturnListener(new ReturnListener() {
public void handleReturn(int replyCode, String replyText, String exchange, String routingKey, AMQP.BasicProperties properties, byte[] body) throws IOException {
String message = new String(body);
logger.info("未发送成功的消息:{}",message);
}
});
image.png
immediate
当immediate参数设为 true 时,如果交换器在将消息路由到队列时发现队列上并不存在任何消费者,那么这条消息将不会存入队列中。当与路由键匹配的所有队列都没有消费者时,该消息会通过 Basic.Return 返回至生产者。
RabbitMQ 3.0 版本开始去掉了对 immediate 参数的支持,
网友评论