RabbitMq消息可靠性

发送可靠性

在这里插入图片描述
在这里插入图片描述
业务场景:使用MQ实现分布式事务

// 进入confirm模式, 每次发送消息,rabbtiqm处理之后会返回一个对应的回执消息
AMQP.Confirm.SelectOk selectOk = channel.confirmSelect();
channel.addConfirmListener(new ConfirmListener() {
	@Override
	public void handleAck(long deliveryTag, boolean multiple) throws IOException {
	      // deliveryTag 同一个channel中此条消息的编号 。
	      // 业务..
	      System.out.println("受理成功 " + queues.get((int) deliveryTag) + " " + multiple);
	}
	@Override
	public void handleNack(long deliveryTag, boolean multiple) throws IOException {
	      // 失败重发
	      // queues.get((int) deliveryTag)
	      System.out.println("受理失败 " + deliveryTag);
	}
});

在这里插入图片描述

消息消费可靠性

在这里插入图片描述

// 监听队列
Channel finalChannel = channel;
 channel.basicConsume(queueName, false, "消费者-手动回执",
         new DefaultConsumer(finalChannel) {
             @Override
             public void handleDelivery(String consumerTag,
                                        Envelope envelope,
                                        AMQP.BasicProperties properties,
                                        byte[] body)
                     throws IOException {
                 try {
                     System.out.println("收到消息: " + new String(body));
                     // TODO 业务处理
                     long deliveryTag = envelope.getDeliveryTag();
                     // 模拟业务处理耗时
                     Thread.sleep(1000L);
                     // 正常消费
                     // finalChannel.basicAck(deliveryTag, false);
                     // 异常消费
                     finalChannel.basicNack(envelope.getDeliveryTag(), false, false);
                 } catch (InterruptedException e) {
                     // 异常消费, requeue参数 true重发,false不重发(丢弃或者移到DLQ死信队列)
                     // finalChannel.basicNack(envelope.getDeliveryTag(), false, false);
                     e.printStackTrace();
                 }
             }
         });
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章