首页 > 其他分享 >rabbitmq - ack机制

rabbitmq - ack机制

时间:2024-10-31 14:42:47浏览次数:1  
标签:false String ack rabbitmq deliveryTag 消息 import 机制 channel

疑问:

  • 在写 demo 的时候,如果 client 被强制中断,消息来不及处理,这时候消息又出队列了,这样不是会产生严重的问题嘛?
  • 一个会话中,可以同时处理一批数据,如果一条失败了,之前的也要求回滚的话,要怎么处理?
  • 获取一个消息之后,发现程序无法处理这条消息,想要退还回去,该怎么办?

方案:

这就涉及到队列的 ACK 机制了,这个机制是 MQ 产品必须提供的一个功能。


import com.rabbitmq.client.*;

import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeoutException;

/**
 * @author Mr.css
 * @version 2020-11-12 19:31
 */
public class ExchangeReceive {
    private static final String QUEUE_NAME = "queue_name";

    public static void main(String[] args) {
        try {
            Connection connection = ConnectionUtil.getConnection();
            Channel channel = connection.createChannel();
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);


            DefaultConsumer consumer = new DefaultConsumer(channel) {

                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
                                           byte[] body) {
                    //查看消息主体内容
                    String message = new String(body, StandardCharsets.UTF_8);
                    System.out.println("[receive]:" + message);

                    // 手动 ACK 消息
                    try {
                        channel.basicAck(envelope.getDeliveryTag(), false);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            };

            // 设置为自动 ACK
            channel.basicConsume(QUEUE_NAME, false, consumer);
        } catch (IOException | ShutdownSignalException | ConsumerCancelledException | TimeoutException e) {
            e.printStackTrace();
        }
    }
}

消息确认

channel.basicAck(deliveryTag, multiple)

  • deliveryTag:消息交付的 tag,取自 Envelope.deliveryTag;
  • multiple:置为 true 的时候,表示截止至目前的所有 tag(包括当前 tag);false 表示只包含当前的 tag。

消息拒绝

与 basicAck() 功能相反的函数,不想处理的消息,可以拒绝退回。

消息拒绝的两个函数的参数是一样的,basicNack可以一次性拒绝多个。

requeue:如果被拒绝的消息应该重新排队,而不是丢弃/死信,则为 true

channel.basicNack(deliveryTag, multiple, requeue);
channel.basicReject(deliveryTag, requeue);

扩展

消息拒绝,又会引出死信队列的概念,以后再去研究吧。

标签:false,String,ack,rabbitmq,deliveryTag,消息,import,机制,channel
From: https://www.cnblogs.com/chenss15060100790/p/18517794

相关文章

  • 深入探索ReentrantLock(二):解锁中断响应机制
     专栏导航JVM工作原理与实战RabbitMQ入门指南从零开始了解大数据目录前言一、ReentrantLock中断响应机制1.lockInterruptibly()方法讲解2.lockInterruptibly()相比于lock()的优势3.lockInterruptibly()案例总结前言Java并发编程中,ReentrantLock作为可重入互斥......
  • Backtrader专题连载
    Backtrader是2015年开源的Python量化回测框架(支持实盘交易)。专注于为量化交易策略提供回测和实盘交易功能。它允许用户集中精力编写可复用的交易策略、指标和分析工具,而无需花费时间构建基础设施。Backtrader基础教程该部分内容将围绕Backtrader几个核心组件,进行......
  • Backtrader-Broker05
    本系列是使用Backtrader在量化领域的学习与实践,着重介绍Backtrader的使用。Backtrader中几个核心组件:Cerebro:BackTrader的基石,所有的操作都是基于Cerebro的。Feed:将运行策略所需的基础数据加载到Cerebro中,一般为K线数据。Indicator:BackTader自带的指标,并集成了talib中的指......
  • 垃圾回收机制
    垃圾回收机制: 1.引用计数法:每个对象都有一个引用计数器,当对象被引用时,计数器加1,当引用失效时,计数器减1,当计数器为0时,对象被回收。垃圾回收器定期(周期性)找出那些不再被引用的对象,然后释放这些对象所占用的内存。 2.标记-清除法:从根节点开始遍历所有对象,标记所有可达的对象,然后清......
  • SBOM SaaS平台新功能上线,引入漏洞预警机制!
    随着数字化浪潮的推进,软件已成为我们生活中不可或缺的一部分。然而,随着软件复杂度的不断提升,其安全性问题也日益凸显。我们会通过体检来检查身体是否存在健康问题,软件同样需要一份“体检报告”。SBOM(软件物料清单)详细记录了软件产品所依赖的所有组件、库、框架等。这一清......
  • 鸿蒙IME Kit高级开发:共享沙箱机制与输入法数据传输
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。HarmonyOS的IMEKit不仅提供了基础......
  • 鸿蒙IME Kit高级开发:共享沙箱机制与输入法数据传输
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。HarmonyOS的IMEKit不仅提供......
  • MySQL max_allowed_packet参数设置
    MySQL根据配置文件会限制Server接受的数据包大小。有时候大的插入和更新会受max_allowed_packet参数限制,导致写入或者更新失败。(比方说导入数据库,数据表)查看目前配置:代码如下:mysql>showVARIABLESlike'%max_allowed_packet%';+--------------------------+--------......
  • YOLOv8改进 - 注意力篇 - 引入GAM注意力机制
    #YOLO##目标检测##计算机视觉#一、本文介绍作为入门性篇章,这里介绍了GAM注意力在YOLOv8中的使用。包含GAM原理分析,GAM的代码、GAM的使用方法、以及添加以后的yaml文件及运行记录。二、GAM原理分析GAM官方论文地址:文章GAM官方代码地址:​GAM注意力机制:GAM采用了顺序的通......
  • 图文并茂教你如何发布自己的NPM包(GitHub Packages npm 包发布)
    前情提要发布包到npm也好,到githubpackages仓库也好,都是一样的道理,只是仓库地址不一样而已,本文是将npm包发布到了GitHubPackages~GitHubPackages简介GitHubPackages是一种软件包托管服务,和npm类似,允许您私下或公开托管软件包,并将包用作项目中的依赖项。快速上手仓库准备......