RabbitMQ之消息确认

注:以下程序使用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发送确认机制就先写这么多,知道应用场景才是学习知识的真正意义,要通过思考找到应用场景或者和业务联系起来

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值