MQ确认机制之事务机制----confirm串行

一:介绍

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.现象

  

原文地址:https://www.cnblogs.com/juncaoit/p/8627622.html

时间: 2024-11-11 19:10:08

MQ确认机制之事务机制----confirm串行的相关文章

RabbitMQ (八) : 消息确认机制之事务机制

实在没啥好说的. 生产者 public class Producer { private const string QueueName = "test_work_queue"; public static void Send() { //获取一个连接 IConnection connection = ConnectionHelper.GetConnection(); //从连接中获取一个通道 IModel channel = connection.CreateModel(); //声明

RabbitMQ发送端事务管理 —— 事务机制 和 确认机制

一.AMQP提供 事务机制,比较消耗性能 try { channel.txSelect(); channel.basicPublish(EXCHANGE_NAME, "queue22", true, MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes()); channel.addReturnListener(new ReturnListener() { public void handleReturn(int arg0, Str

PostgreSQL串行化隔离级别(SSI)的能力与实现

https://zhuanlan.zhihu.com/p/37087894 PostgreSQL9.1是第一个采用Serializable Snapshot Isolation(SSI)实现串行化隔离级别的生产级数据库. 本文的目标是学习与分析SSI的设计思路,以及在PG中的实现与优化.首先介绍了隔离级别以及实现其的两个基本并发控制机制,给出了PG的SI未达到串行化的案例,分析原因并给出直观的解决思路,其次阐述了SSI的技术思路与关键环节,最后就PG内核中SSI的实现与优化思路进行了分析. 1.

关于ORACLE的串行化隔离级别--来自ORACLE概念手册

为了描述同时执行的多个事务如何实现数据一致性,数据库研究人员定义了被 称为串行化处理(serializability)的事务隔离模型(transaction  isolation model).当所有事务都采取串行化的模式执行时,我们可以认为同一时间只有 一个事务在运行(串行的),而非并发的 以串行化模式对事务进行隔离的效果很好,但在此种模式下应用程序的效率将 大大降低.将并行执行的事务完全隔离意味着即便当前只存在一个对表进行查 询(query)的事务,其他事务 也不能再对此表进行插入(inse

RabbitMQ之消息确认机制(事务+Confirm)

概述 在使用RabbitMQ的时候,我们可以通过消息持久化操作来解决因为服务器的异常奔溃导致的消息丢失,除此之外我们还会遇到一个问题,当消息的发布者在将消息发送出去之后,消息到底有没有正确到达broker代理服务器呢?如果不进行特殊配置的话,默认情况下发布操作是不会返回任何信息给生产者的,也就是默认情况下我们的生产者是不知道消息有没有正确到达broker的,如果在消息到达broker之前已经丢失的话,持久化操作也解决不了这个问题,因为消息根本就没到达代理服务器,你怎么进行持久化,那么这个问题该怎

学习RabbitMQ(三):AMQP事务机制

本文转自:http://m.blog.csdn.net/article/details?id=54315940 在使用RabbitMQ的时候,我们可以通过消息持久化操作来解决因为服务器的异常奔溃导致的消息丢失,除此之外我们还会遇到一个问题,当消息的发布者在将消息发送出去之后,消息到底有没有正确到达broker代理服务器呢?如果不进行特殊配置的话,默认情况下发布操作是不会返回任何信息给生产者的,也就是默认情况下我们的生产者是不知道消息有没有正确到达broker的,如果在消息到达broker之前已经

RabbitMQ事务和Confirm发送方消息确认——深入解读

引言 根据前面的知识(深入了解RabbitMQ工作原理及简单使用.Rabbit的几种工作模式介绍与实践)我们知道,如果要保证消息的可靠性,需要对消息进行持久化处理,然而消息持久化除了需要代码的设置之外,还有一个重要步骤是至关重要的,那就是保证你的消息顺利进入Broker(代理服务器),如图所示: 正常情况下,如果消息经过交换器进入队列就可以完成消息的持久化,但如果消息在没有到达broker之前出现意外,那就造成消息丢失,有没有办法可以解决这个问题? RabbitMQ有两种方式来解决这个问题: 通

ActiveMQ源码解析(四):聊聊消息的可靠传输机制和事务控制

在消息传递的过程中,某些情况下比如网络闪断.丢包等会导致消息永久性丢失,这时消费者是接收不到消息的,这样就会造成数据不一致的问题.那么我们怎么才能保证消息一定能发送给消费者呢?怎么才能避免数据不一致呢?又比如我们发送多条消息,有时候我们期望都发送成功但实际上其中一部分发送成功,另一部分发送失败了,没达到我们的预期效果,那么我们怎么解决这个问题呢? 前一种问题我们通过消息确认机制来解决,它分为几种模式,需要在创建session时指定是否开启事务和确认模式,像下面这样: <span style=&quo

Redis的事务机制

1.redis的事务是什么 可以一次执行多个命令,本质是一组命令的集合,一个事务中的所有命令都会被序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞(排队时后来者插到先到者前面的行为.) 也就是说,在队列中,一次性.顺序性.排他性的执行一系列命令的行为. 看看官方的介绍: 注: redis 的事务是能够使用 MULTI 命令的行为,这个命令通常会响应为 OK,在这种情况下,使用者可以进行多个命令的操作,redis会安排它们入队列而不是执行这些命令,这些所有命令在键入 EXEC 时才会被调用