同样我只是对自己学习做一个总结啊。。本人新手较菜嗯
消息确认模式
消息的确认,是指生产者投递消息给Broker后,如果Broker收到消息,则会给生产端一个回复(reply)。然后生产端便可以接收这个回复,从而可以确认你这条扔到Broker的消息正常到达了Broker。
简单画了张图,大概就是这么个逻辑。
接下来看看实现。
确认消息机制的代码实现
//首先用channel开启确认模式
channel.confirmSelect();
//然后是通过channel添加一个确认监听器
channel.addConfirmListener(new ConfirmListener() {
//监听到Broker发来了ack,即确认投递
@Override
public void handleAck(long deliveryTag, boolean multiple) throws IOException {
System.out.println("--------ack!----------");
}
//监听非正常投递,即nack
@Override
public void handleNack(long deliveryTag, boolean multiple) throws IOException {
System.out.println("-------no ack!--------");
}
});
Return消息机制
Return Listener用于处理一些不可路由的消息
消息生产者通过指定一个Exchange和RoutingKey,把消息送到一个队列上去,然后消费者监听这个队列,进行消费处理操作。
发送消息的时候,当前的Exchange不存在或者指定的routingKey路由不到,这时需要监听不可到达的消息,即用到ReturnListener
这里要注意与confirm机制的区别,confirm机制是说你这条消息有没有正常地发到Broker上,而不是有没有正常路由。
代码实现:
//添加ReturnListener,要重载handleReturn方法
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("------------handle return-------------");
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));
}
});
//basicPublish使用有五个参数的重载函数,参数三设置为true,开启监听模式
channel.basicPublish(exchangeName,routingKey,true,null,
"Hello Return Message".getBytes());