1. 程式人生 > >MQ確認機制之事務機制----confirm串行

MQ確認機制之事務機制----confirm串行

技術 全部 main 就會 多條 技術分享 接受 send wait

一:介紹

1.說明原理

  A:生產者將信道設置成confirm模式,一旦信道進到confirm模式,所有該信道上發布的消息都會被指派一個唯一的ID(從1開始)。

  一旦消息被投遞到所有匹配的隊列後,broker就會發送一個確認給生產者,並包括了唯一的ID,這樣就使得生產者知道消息已經到達目的隊列。

  B:如果消息和消息隊列是可持久化的,那麽確認消息會將消息寫入磁盤後發出,broker會回傳給生產者的確認消息中deliver-tag域包含了確認消息的序列號,並且broker也可以設置basic.ack的multiple域。

  用來表示這個序列號之前所有的消息已經得到處理。

二:程序(發送一條數據)

1.生產者

 1 package com.mq.confirm;
 2 
 3 import com.mq.utils.ConnectionUtil;
 4 import com.rabbitmq.client.Channel;
 5 import com.rabbitmq.client.Connection;
 6 
 7 public class Send {
 8     private static final String QUEUE_NAME="test_queue_confirm";
 9     public static void main(String[] args)throws
Exception{ 10 Connection connection= ConnectionUtil.getConnection(); 11 Channel channel=connection.createChannel(); 12 channel.queueDeclare(QUEUE_NAME,false,false,false,null); 13 14 channel.confirmSelect(); 15 String msg="confirm msg"; 16 channel.basicPublish("",QUEUE_NAME,null
,msg.getBytes()); 17 18 if (!channel.waitForConfirms()){ 19 System.out.println("message send failed"); 20 }else{ 21 System.out.println("message send success"); 22 } 23 } 24 }

2.消費者

 1 package com.mq.confirm;
 2 
 3 import com.mq.utils.ConnectionUtil;
 4 import com.rabbitmq.client.*;
 5 
 6 import java.io.IOException;
 7 
 8 public class Receive {
 9     private static final String QUEUE_NAME="test_queue_confirm";
10     public static void main(String[] args)throws Exception {
11         Connection connection = ConnectionUtil.getConnection();
12         Channel channel = connection.createChannel();
13         channel.queueDeclare(QUEUE_NAME, false, false, false, null);
14         channel.basicConsume(QUEUE_NAME,true,new DefaultConsumer(channel){
15             @Override
16             public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
17                 System.out.println(new String(body,"utf-8"));
18             }
19         });
20     }
21 }

3.現象

  發送成功後,在send端會返回發送成功、

  在接收端會接受到信息。

  技術分享圖片

  技術分享圖片

三:程序(發送多條)

1.生產者

 1 package com.mq.confirm;
 2 
 3 import com.mq.utils.ConnectionUtil;
 4 import com.rabbitmq.client.Channel;
 5 import com.rabbitmq.client.Connection;
 6 
 7 public class SendMultipleMessage {
 8     private static final String QUEUE_NAME="test_queue_confirm";
 9     public static void main(String[] args)throws Exception{
10         Connection connection= ConnectionUtil.getConnection();
11         Channel channel=connection.createChannel();
12         channel.queueDeclare(QUEUE_NAME,false,false,false,null);
13 
14         channel.confirmSelect();
15         String msg="confirm msg";
16 
17         //一次性發送多條數據
18         for (int i=0;i<10;i++){
19             channel.basicPublish("",QUEUE_NAME,null,msg.getBytes());
20         }
21 
22         //確認一次
23         if (!channel.waitForConfirms()){
24             System.out.println("message send failed");
25         }else{
26             System.out.println("message send success");
27         }
28     }
29 }

2.原理‘

  原理就是一次發送多條數據,然後一次返回判斷。

  缺點:如果丟失,就是全部丟失。

3.現象

  技術分享圖片

MQ確認機制之事務機制----confirm串行