MQ確認機制之事務機制----confirm串行
阿新 • • 發佈:2018-03-23
技術 全部 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)throwsException{ 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串行