在使用RabbitMQ向Broker发送消息时,有一个mandatory参数.默认情况下,该参数为false.该参数与回调ReturnListener有关.
回调ReturnListener需要满足以下条件:
- 发送消息到达Exchange,但是Exchange没有与其他Queue绑定
- mandatory设置为true.
如果上面两个条件任何一个条件没有满足是不会触发ReturnListener回调的.
例子一:
public class MandatoryDemo {
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("127.0.0.1");
factory.setUsername("root");
factory.setPassword("root");
factory.setPort(5672);
factory.setVirtualHost("/order");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.confirmSelect();
//创建exchange
channel.exchangeDeclare("exchange_1",BuiltinExchangeType.FANOUT,true);
channel.addReturnListener(new ReturnListener() {
@Override
public void handleReturn(int replyCode, String replyText, String exchange, String routingKey, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("replyCode = " + replyCode);
System.out.println("replyText = " + replyText);
System.out.println("exchange = " + exchange);
System.out.println("properties = " + properties);
System.out.println("body = " + new String(body));
}
});
channel.addShutdownListener(new ShutdownListener() {
@Override
public void shutdownCompleted(ShutdownSignalException cause) {
System.out.println("cause = " + cause);
}
});
//设置mandatory为true
channel.basicPublish("exchange_1","",true,MessageProperties.PERSISTENT_TEXT_PLAIN,"test_message".getBytes());
}
}
上面代码有两个关键的地方:
- 创建exchange
- 发送消息时,mandatory设置为true
如果exchange没有创建时,则会报一下错误,会触发ShutdownListener回调:
cause = com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no exchange 'exchange_1' in vhost '/order', class-id=60, method-id=40)
如果mandatory没有设置为true,运行结果是控制台不会输出任何信息,即不会触发ReturnListener回调