如何确认RabbitMq发送消息的可靠性

本文详细介绍了如何确保RabbitMQ消息发送的可靠性,包括启用发送端确认机制(单条同步、多条同步和异步确认)以及消息路由的确认。通过开启消息返回机制,可以确认消息是否被正确路由。同时,针对消费端异常,文章建议使用手动ACK以确保消息被正确处理。这些方法有助于防止消息丢失,保障业务流程的正常运行。
摘要由CSDN通过智能技术生成
如何确认RabbitMq发送消息的可靠性
消息真的发出去了吗?

消息发送后,发送端不知道RabbitMQ是否真的收到了消息,如果RabbitM异常,那么消息丢失后,业务流程就停止,发生异常,所以我们需要使用RabbitMq发送端确认机制,确认消息发送

消息确认机制分为:单条同步确认机制,多条同步确认机制和异步确认机制

我们需要使用channel开启消息确认机制

//开启消息确认机制
channel.confirmSelect();
/**
单条和多条同步确认机制都是使用此方法,返回true或false
单条意味着每发出一条消息都会进行确认

多条意味着发出多条在进行确认,但是当消息出现异常时,只会返回false,无法确定是哪条消息出错
*/
channel.waitForConfirms()
/**
异步确认消息
会开启一个异步的线程进行确认消息,但是他不确定是返回多条消息的确认还是单条消息的确认是随机产生的
*/
ConfirmListener confirmListener = new ConfirmListener() {
    /**
     * 返回成功
     * @param deliveryTag  消息的编号
     * @param multiple  true 确认多条,false 确认单条
     * @throws IOException
     */
    @Override
    public void handleAck(long deliveryTag, boolean multiple) throws IOException {
        log.info("Ack, deliveryTag:{},multiple: {}", deliveryTag, multiple);
    }

    /**
     * 返回失败
     * @param deliveryTag  消息的编号
     * @param multiple  true 确认多条,false 确认单条
     * @throws IOException
     */
    @Override
    public void handleNack(long deliveryTag, boolean multiple) throws IOException {
        log.info("Nack, deliveryTag:{},multiple: {}", deliveryTag, multiple);
    }
};
channel.addConfirmListener(confirmListener);

综上所述,最好使用单条确认消息机制

消息真的被路由了吗?

消息发送后,发送端不知道消息是否被正确路由,若路由异常,消息会被丢弃,消息丢弃后,业务发生异常,所以我们需要使用RabbitMQ消息返回机制,确认消息被正确路由

注意消息确认代表消息是否被发送到消息段

而消息路由,是消息已经发送到消息端,确认消息是否被交换机发送到队列

/*-------使用消息返回机制---------*/
channel.addReturnListener(new ReturnListener() {
    	/**
        * 只有在消息无法被路由时,才会调用此方法
        * @param replyCode  返回编号
        * @param replyText  返回消息
        * @param exchange   交换机的名字
        * @param routingKey  绑定的key
        * @param properties
        * @param body     要发送的消息
        * @throws IOException
        */
        @Override
        public void handleReturn(int replyCode, String replyText, String exchange, String routingKey, AMQP.BasicProperties properties, byte[] body) throws IOException {
        log.info("Message Return:" +
                 "replyCode:{},replyText:{},exchange:{},routingKey:{},properties:{},body:{},",
                 replyCode,replyText,exchange,routingKey,properties,new String(body));
    }
});

/**
在发送消息时,我们需要先开启消息返回机制
第三个参数代表是否开启消息返回机制
*/
channel.basicPublish("exchange.order.restaurant", "key.order", true,null, messageToSend.getBytes());
消费端处理异常怎么办

默认情况下,消费端接收消息时,消息会被自动确认(ACK),消费端消息处理异常时,发送端与消息中间件无法得知消息处理情况,所以需要使用RabbitMQ消息端确认机制,确认消息被正确处理

/**
首先需要将自动ACK关闭,改为手动ACK
第二个参数
*/
channel.basicConsume("queue.restaurant",false,deliverCallback, consumerTag -> {});
DeliverCallback deliverCallback = (consumerTag, message) -> {
    /**
    * 第一个参数表示消息的编号
    * 第二个参数使用单条确认
    */
    channel.basicAck(message.getEnvelope().getDeliveryTag(), false);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

默默行路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值