注:以下程序使用C#实现
RabbitMQ消息确认可分为两种:消费端确认和发布端确认
消费端确认方式:
1.自动确认:
在程序中使用BasicGet方法:
var channel=connection.CreateModel();
//自动确认
BasicGetResult result=channel.BasicGet("mytest",true);//第一个参数是队列名称,第二个参数代表是否自动确认,true:自动确认,false:不自动确认
当我们给BasicGet方法第二个参数传递true时,消息在被消费之后,会自动告诉RabbitMQ该消息已收到,RabbitMQ这时候会把该条消息从队列中移除
2.手工确认
var channel=connection.CreateModel();
//不自动确认
BasicGetResult result=channel.BasicGet("mytest",true);
//采用手工确认
channel.BasicAck(result.DeliveryTag,false);
如果我们给BasicGet方法第二个参数传递false时,消息在被消费之后,如果我们还没有来得及进行手工确认,当我们消费端的connection断开连接之后,该消息会重新被加入队列,也就是说,在手工确认机制下,消息不会丢失
3.手动拒绝
var channel=connection.CreateModel();
//不自动确认
BasicGetResult result=channel.BasicGet("mytest",true);
//采用手工拒绝
channel.BasicReject(result.DeliveryTag,false);//第一个参数是消息的Tag,第二个参数代表是否将消息重新扔回队列,false表示直接丢弃,true表示重新入队
//还有一种方式是将消息重新入队
channel.BasicRecover(true);//参数true或false代表将消息重新入队到哪个队列,true表示还加入到当前发送的队列,false表示同一exchange下的队列,注意:false在.net中不可用,会抛异常
发送端确认机制:
手工确认:确认消息是否已经发送到了broker
1.confirm
var channel=connection.CreatModel();
channel.ConfirmSelect();//发布确认
for(int i=0;i<100;i++){
channel.BasicPublish(string.Empty,"",null,Encoding.UTF8.GetBytes("你好"));
}
var allPublish=channel.WaitForConfirms();//等待所有消息确认完毕
if(allPublish){
Console.WriteLine("所有消息已发送完毕");
}
else{
Console.WriteLine("消息没有发送完毕");
}
2.Tx
var channel=connection.CreatModel();
try{
channel.TxSelect();//发布确认
for(int i=0;i<100;i++){
channel.BasicPublish(string.Empty,"",null,Encoding.UTF8.GetBytes("你好"));
}
channel.TxCommit();//提交确认
}
catch(Exception ex){
channel.TxRollback();//回滚消息
}
RabbitMQ发送确认机制就先写这么多,知道应用场景才是学习知识的真正意义,要通过思考找到应用场景或者和业务联系起来