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();
                 }
             }
         });
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章