发布消息示例
channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, true, false, properties.build(), message.getBytes());
参数:
- mandatory:如果为true, 消息不能路由到指定的队列时,则会调用basic.return方法将消息返回给生产者,会触发addReturnListener注册的监听器;如果为false,则broker会直接将消息丢弃
- immediate:如果为true,当exchange将消息路由到queue时发现queue上没有消费者,那么这条消息不会放入队列中,该消息会通过basic.return方法返还给生产者。
在RabbitMQ3.0以后的版本里去掉了immediate参数的支持,发送带immediate=true的publish会返回如下错误, com.rabbitmq.client.AlreadyClosedException: connection is already closed due to connection error; protocol method: #method<connection.close>(reply-code=540, reply-text=NOT_IMPLEMENTED - immediate=true, class-id=60, method-id=40)
为什么会取消immediate参数支持,immediate标记会影响镜像队列性能,增加代码复杂性,并建议采用TTL和DLX等方式代替
生产者接收退回的消息
提供了两个接收回退消息的监听器方法,实现的方式基本一样,第二个更简洁一些,推荐使用第二种方法:
void addReturnListener(ReturnListener listener)
ReturnListener addReturnListener(ReturnCallback returnCallback)
第一种方案示例:
channel.addReturnListener((replyCode, replyText, exchange, routingKey, properties, body) -> {
System.out.println("第一个监听器执行了---");
});
第二种方案示例(是不是很简介):
channel.addReturnListener((returnMessage)-> {
System.out.println("第二个监听器执行了---");
});