RabbitMQ - 发布确认

1.发布确认的策略

复制代码
//开启发布确认
channel.confirmSelect();

2.单个确认发布

复制代码
/**
 * 单个发送
 */
public static void publishMessageIndividually() throws Exception {
    Channel channel = RabbitMqUtils.getChannel();
    //队列声明
    String queueName = UUID.randomUUID().toString();
    channel.queueDeclare(queueName, true, false, false, null);
    //开启发布确认
    channel.confirmSelect();

    long begin = System.currentTimeMillis();

    for (int i = 0; i < MESSAGE_COUNT; i++) {
        String message = i + "";
        channel.basicPublish("", queueName, null, message.getBytes());
        //服务端返回 false 或超时时间内未返回,生产者可以消息重发
        boolean flag = channel.waitForConfirms();
        if (flag) {
            System.out.println("消息发送成功");
        }
    }

    long end = System.currentTimeMillis();
    System.out.println("发布" + MESSAGE_COUNT + "个单独确认消息,耗时" + (end - begin) + "ms");

}

3.批量确认发布

复制代码
/**
 * 批量
 */
public static void publishMessageBatch() throws Exception {
    Channel channel = RabbitMqUtils.getChannel();
    //队列声明
    String queueName = UUID.randomUUID().toString();
    channel.queueDeclare(queueName, true, false, false, null);
    //开启发布确认
    channel.confirmSelect();
    //批量确认消息大小
    int batchSize = 100;
    //未确认消息个数
    int outstandingMessageCount = 0;
    long begin = System.currentTimeMillis();

    for (int i = 0; i < MESSAGE_COUNT; i++) {
        String message = i + "";
        channel.basicPublish("", queueName, null, message.getBytes());
        outstandingMessageCount++;
        if (outstandingMessageCount == batchSize) {
            channel.waitForConfirms();
            outstandingMessageCount = 0;
        }
    }
    //为了确保还有剩余没有确认消息 再次确认
    if (outstandingMessageCount > 0) {
        channel.waitForConfirms();
    }
    long end = System.currentTimeMillis();
    System.out.println("发布" + MESSAGE_COUNT + "个批量确认消息,耗时" + (end - begin) + "ms");
}

4.异步确认发布

相关推荐
搞不懂语言的程序员12 分钟前
Kafka Producer的acks参数对消息可靠性有何影响?
分布式·kafka
cooldream20091 小时前
构建现代分布式云架构的三大支柱:服务化、Service Mesh 与 Serverless
分布式·架构·系统架构师·service_mesh
浪前1 小时前
【项目篇之消息序列化】仿照RabbitMQ模拟实现消息队列
分布式·rabbitmq
BD_Marathon1 小时前
Anaconda中配置Pyspark的Spark开发环境
大数据·分布式·spark
孤海岛主2 小时前
分布式链路ID实现
java·spring boot·分布式·spring cloud
lisacumt2 小时前
【jceks】使用keytool和hadoop credential生成和解析jceks文件(无密码storepass)
大数据·hadoop·分布式
smileNicky4 小时前
RabbitMQ Linux 安装教程详解
linux·分布式·rabbitmq
冼紫菜6 小时前
[特殊字符] 基于Docker部署Nacos注册中心及微服务注册发现详解(含MySQL持久化配置)
分布式·mysql·docker·微服务·容器
九章云极AladdinEdu10 小时前
量子机器学习中的GPU加速实践:基于CUDA Quantum的混合编程模型探索
人工智能·分布式·机器学习·ai·ai编程·gpu算力·量子计算
时序数据说13 小时前
IoTDB集群部署中的网络、存储与负载配置优化
大数据·网络·分布式·时序数据库·iotdb