RabbitMQ 发送方确认机制

消息发送方(生产者)如何知道消息是否真正地到达了 RabbitMQ(服务器)
生产者将信道设置成 confmn 确认)模式,一旦信道进入 confmn 模式,所有在该信道上面发布的消息都会被指派个唯一的 ID(1开启),一旦消息被投递到所有匹配的队列之后,RabbitMQ 会发送一个确认 CBasic.Ack) 给生产者(包含消息的唯一 ID) ,这就使得生产者知晓消息已经正确到达了目的地了。如果消息和队列是可持久化的,那么确认消息会在消息写入磁盘之后发出。

实现步骤

  • 生产者将信道设置成confirm (确认)模式
  • 所有在开启确认模式信道上面发布的消息都会被指派一个唯一的ID(从l开始递增)
  • 一旦消息被投递到所有匹配的队列之后,RabbitMQ就会发送一个确认CBasic.Ack) 给生产者(包含消息的唯一ID),如果消息和队列是可持久化的,那么确认消息会在消息写入磁盘之后才发出。

将信道置为 publisher confirm 模式

 channel.confirmSelect();

判断是否发送成功

if (!channel.waitForConfirms()) {
      System.out.println( "send message failed" ) ;
      }else {
         //do something
}

代码

public class Send {
    //队列名
    private final static String QUEUE_NAME = "queue2";
    //路由器名
    private final static String EXCHANGE_NAME = "exchange";
    //绑定键
    private final static String BINDING_KEY = "exchange";
    //路由键
    private final static String ROUTING_KEY = "exchange";

    private static Connection connection =null;
    private static Channel channel = null;
    public static void main(String[] args) {
        try{
            // 获取到连接以及mq通道
            connection = ConnectionUtil.getConnection();
            // 从连接中创建通道
            channel = connection.createChannel();
            //声明了一个direct 类型的交换器
            channel.exchangeDeclare(EXCHANGE_NAME,"direct",true,false,null);
            // 声明优先级队列
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            //将路由与队列绑定,再为绑定的路径赋值一个绑定键
            channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,BINDING_KEY);
            // 将信道置为 publisher confirm 模式
            channel.confirmSelect();
            //发送数据
            for (int i=0;i<100;i++){
                String message = "Hello World!"+i;
                channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, true,null, message.getBytes());
                System.out.println(" [x] Sent '" + message + "'");
                if (!channel.waitForConfirms()) {
                    System.out.println( "send message failed" ) ;
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //关闭通道和连接
            try {
                channel.close();
                connection.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RabbitMQ是一个开源的消息队列系统,它提供了一种称为补偿机制(Compensation Mechanism)的式来处理消息的可靠性传输。补偿机制可以确保消息发送消费过程中出现异常时,能够重新发送或处理消息,以保证消息的可靠性传递。 补偿机制的基本原理如下: 1. 发送补偿:当消息发送RabbitMQ时,发送可以设置确认机制(Confirm Mechanism),即等待RabbitMQ返回消息确认。如果发送没有收到确认消息,它可以将消息重新发送RabbitMQ。这种式可以确保消息能够成功发送到队列中。 2. 消费补偿:当消费者从队列中获取消息并处理时,消费可以设置应答机制(Ack Mechanism)。如果消费者在处理消息时发生异常,它可以拒绝应答,使消息重新返回到队列中。这样,RabbitMQ会将消息重新分发给其他消费者进行处理,确保消息不会丢失。 通过发送消费的补偿机制RabbitMQ能够在消息传输过程中处理异常情况,并确保消息的可靠性传递。发送的补偿机制可以保证消息成功发送到队列中,而消费的补偿机制可以确保消息被正确处理,避免消息丢失或处理失败。 需要注意的是,补偿机制并不能完全消除消息丢失或处理失败的可能性,它只能在一定程度上提高消息的可靠性。在使用RabbitMQ时,应根据具体业务需求和性能要求,选择合适的补偿机制策略,以确保消息传递的可靠性和性能的平衡。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值