Java教程:RabbitMq如何开启发布手动确认模式,采用及时或异步方式确定消息是否发送到队列

Posted 首席摸鱼师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java教程:RabbitMq如何开启发布手动确认模式,采用及时或异步方式确定消息是否发送到队列相关的知识,希望对你有一定的参考价值。

引言:

自我们安装好rabbitmq之时,系统默认生产者与消费者发布消费机制为自动模式,也就是说无需我们知道是否成功,即发布方法调取之后,消费者无异常后,整个流程完毕,但由于我们业务当中,由于网络波动或服务异常,消息有可能未成功被处理,这就需要我们确保消息真的到达了队列,或真的被消费成功,此文章将为大家讲解如何确定发布者将消息是否到达了交换机或队列

本次我们采用rabbitTemplate方式发送

rabbitmq发布确认有三种方式:

  1. 单独发布消息:同步等待确认,简单,但吞吐量非常有限
  2. 批量发布消息:批量同步等待确认,简单,合理的吞吐量,一旦出现问题但很难推断出是哪条消息出现了问题。
  3. 异步处理:最佳性能和资源利用,在出现错误的情况下可以很好地控制,但是实现起来稍微复杂一些。

一、yml文件添加如下:

# spring
spring:
 #配置rabbitMq 服务器
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: test
    password: test
    publisher-confirm-type: correlated    // 此处为新加

二、代码实现:

  1. 单独发布消息
rabbitTemplate.convertAndSend("exchage", "routingkey", "消息体");
boolean flag = rabbitTemplate.waitForConfirms(1000);
if(flag)
    System.out.println("收到消息!");

 单独发布采用waitForConfirms(1000)方法来同步接收确认结果,如在指定时间内未确认发布成功则抛出异常,如发布消息失败则返回false,成功为true
  1. 批量发布消息
for(int i = 0; i < 10; i++)
	rabbitTemplate.convertAndSend("exchage", "routingkey", "消息体");

if(flag)
    System.out.println("Broker已经收到消息!");

批量发布与单独发布无异,只是发布一批消息后再确定
  1. 异步回调发布消息
// 设置消息回调,一个rabbitTemplate实例只能设置一次
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() 
   @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) 
        if (ack) 
		    log.debug("接收消息成功,订单号:", correlationData.getId());
		 else 
		    log.error("接收消息失败,订单号:,原因:", correlationData.getId(), cause);
		
    
);

// 发布消息
CorrelationData correlationData = new CorrelationData(id);
rabbitTemplate.convertAndSend("exchage", "routingkey", "消息体", correlationData);
异步发送即确定是是否被发送到了交换机,成功或失败均会在回调方法显示,大大提高了效率,推荐使用

此次教程就先讲到这里,还有一种回调是ReturnCallback,代表消息是否成功送达到queue,我们下回分解~

以上是关于Java教程:RabbitMq如何开启发布手动确认模式,采用及时或异步方式确定消息是否发送到队列的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ消息队列笔记

RabbitMQ消息队列笔记

RabbitMQ 消息队列学习

如何配置RabbitMQ(在Spring Boot 2.x中),以便手动确认工作

在 RabbitMQ 中手动确认消息

RabbitMQ 消息确认与公平调度消费者