RabbitMQ高级特性------Consumer Ack

消息队列,消息队列,消息队列!

Consumer Ack是指消费端收到消息后的确认方式,常见的有两种确认方式:

自动确认:acknowledge=“none”,自动确认是指消息一旦被consumer接收到,那么则自动确认收到,并将相应的message从消息队列中移除。这种处理方式不安全,因为消息被接受了但是业务没有处理成功,那么就会造成消息丢失
手动确认:acknowledge=“manual”,如果消息被consumer接收到,就调用channelbasicAck()签收;如果没有被接收到,调用basicNack()拒绝签收,broker重新发送给consumer

所以在业务中,我们最好选用手动确认的方式,以免发生问题,导致消息丢失。
自动确认:
先设置相应的属性。
在这里插入图片描述

package com.thorns.listener;


import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Component
public class AckListener implements ChannelAwareMessageListener {


    @Override
    public void onMessage(Message message, Channel channel){
            System.out.println(new String(message.getBody()));

    }
}

手动确认:
也是同样的,需要先设置相应的属性。

在这里插入图片描述

package com.thorns.listener;


import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * 设置手动签收
 *  acknowledge="manual"
 *  让监听器类实现ChannelAwareMessageListener接口
 *  如果消息成功处理,则调用channel的basicAck()签收
 *  如果消息处理失败,则调用basicNack()拒绝签收,broker重新发送给consumer
 */
@Component
public class AckListener implements ChannelAwareMessageListener {


    @Override
    public void onMessage(Message message, Channel channel) throws Exception {
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        try {
            System.out.println(new String(message.getBody()));
            System.out.println("处理业务逻辑");
//            手动设置一个异常
            int i = 3/0;
            channel.basicAck(deliveryTag,true);
        }catch (IOException e){
//            e.printStackTrace();
            /**
             * 第三个参数,重回队列;如果设置为true,则消息重回到queue,broker会重新发消息给消费端
             */
            channel.basicNack(deliveryTag,true,true);
        }
    }
}

整理博客不易,觉得有帮助的小伙伴点个赞吧~感谢收看!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值