1. 正常的消息流程

  上面这张图,是一个正常的消息从生产到消息流程。在上一篇文章RabbitMQ学习总结(3)-集成SpringBoot中,代码里使用消息确认,消息回退机制,现在详细说一下。

2.1 消息发送确认

  消息确认机制,需要实现RabbitTemplate类的一个内部接口ConfirmCallback,这个接口的作用是生产者把消息发送到交换机的结果回调。(Producer ----->  Exchange)

  

  参数包括:

  CorrelationData correlationData:可以封装业务ID信息,需要在发送消息时传入此参数,这里才能接收到,否则是null

  boolean ack:消息发送的结果状态,发送成功是true,失败是false

  String cause:发送失败的描述信息,如果发送成功是null。

    /**
* A callback for publisher confirmations.
*/
@FunctionalInterface
public interface ConfirmCallback { /**
* Confirmation callback.
* @param correlationData correlation data for the callback.
* @param ack true for ack, false for nack
* @param cause An optional cause, for nack, when available, otherwise null.
*/
void confirm(@Nullable CorrelationData correlationData, boolean ack, @Nullable String cause); }

2.2 失败回调

  失败回调,需要实现RabbitTemplate类的一个内部接口ReturnCallback,这个接口的作用是消息从交换机到队列的结果回调。(Exchange  -----> Queue )。消息从交换到队列失败,失败原因可能是路由键不存在,通道未绑定等等,一般都跟配置有关系。

  参数包括:

  Message message:发送的消息内容 + 发送消息的配置信息

  int replyCode:状态码,发送成功是200

  String replyText:发送消息失败的描述信息

  String exchange:消息使用的交换机

  String routingKey:消息使用的路由键

    /**
* A callback for returned messages.
*/
@FunctionalInterface
public interface ReturnCallback { /**
* Returned message callback.
* @param message the returned message.
* @param replyCode the reply code.
* @param replyText the reply text.
* @param exchange the exchange.
* @param routingKey the routing key.
*/
void returnedMessage(Message message, int replyCode, String replyText,
String exchange, String routingKey);
}

2. 异常消息流程

2.1 消息退回

  在消费者接收到消息之后,如果这个消息有问题,或者不是消费者想要的消息,可以把消息退回到原队列。退回原队列要确保有其他的服务可以再次消费这条消息。

  参数说明:

  long deliveryTag:消息唯一标识,这是RabbitMQ自动生成的,不需要人为管理,只需要从message.getMessageProperties().getDeliveryTag() 就可以获得。

  boolean multiple:是否批量退回,不开启就使用false,开启批量退回需要增加自己的业务判断逻辑(比如:攒够几条再批量回退,或者设置等待间隔等等)

  boolean requeue:是否退回到消息队列,退回就使用true,就是交给其他消费者处理。

    void basicNack(long deliveryTag, boolean multiple, boolean requeue) throws IOException;

2.2 死信交换机

  死信交换机,顾名思义,就是不能再使用的消息,都会到这里来。其实谓死信交换机, 只是对应的队列设置了对应的交换机是死信交换机, 对于交换机来讲, 他还是一个普通的交换机 。

  一般进入死信交换机有3种情况:

  • 1. 消息被退回,又没有被退回到原队列。就是2.1中的requeue参数设置成false的情况。
  • 2. 当消息过期了。队列在创建时如果设置了消息过期时间,消息超过这个时间还没有被消息的情况。
  • 3. 消息超过队列容量。队列设置了最大长度、最大容量,如果超出容量存不下的情况。

  死信交换机的定义,在创建队列时,给队列指定它的死信交换机。

    @Bean
public Queue queue() {
Map<String,Object> map = new HashMap<>();
//设置消息的过期时间 单位毫秒
map.put("x-message-ttl",10000);
//设置附带的死信交换机
map.put("x-dead-letter-exchange","exchange.dlx");
//指定重定向的路由建 消息作废之后可以决定需不需要更改他的路由建 如果需要 就在这里指定
map.put("x-dead-letter-routing-key","dead.order");
return new Queue("testQueue", true,false,false,map);
}

  注意:这里的死信交换机名称“exchange.dlx”是要提前定义好的,并且绑定它自己的队列,否则会报错。

3. RabbitMQ常用配置参数

3.1 队列参数

参数名

配置作用

x-dead-letter-exchange

死信交换机

x-dead-letter-routing-key

死信消息重定向路由键

x-expires

队列在指定毫秒数后被删除

x-ha-policy

创建HA队列

x-ha-nodes

HA队列的分布节点

x-max-length

队列的最大消息数

x-message-ttl

毫秒为单位的消息过期时间,队列级别

x-max-priority

最大优先值为255的队列优先排序功能

3.2 消息参数

参数名

配置作用

content-type

消息体的MIME类型,如application/json

content-encoding

消息的编码类型

message-id

消息的唯一性标识,由应用进行设置

correlation-id

一般用做关联消息的message-id,常用于消息的响应

timestamp

消息的创建时刻,整形,精确到秒

其实我们刚刚发现所谓死信交换机,只是对应的队列设置了对应的交换机是死信交换机,对于交换机来讲,他还是一个普通的交换机。

RabbitMQ学习总结(4)-消息处理机制的更多相关文章

  1. Android学习之异步消息处理机制

    •前言 我们在开发 APP 的过程中,经常需要更新 UI: 但是 Android 的 UI 线程是不安全的: 如果想更新 UI 线程,必须在进程的主线程中: 这里我们引用了异步消息处理机制来解决之一问 ...

  2. 【RabbitMQ学习记录】- 消息队列存储机制源码分析

    本文来自 网易云社区 . RabbitMQ在金融系统,OpenStack内部组件通信和通信领域应用广泛,它部署简单,管理界面内容丰富使用十分方便.笔者最近在研究RabbitMQ部署运维和代码架构,本篇 ...

  3. Android应用开发学习笔记之多线程与Handler消息处理机制

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 和JAVA一样,Android下我们可以通过创建一个Thread对象实现多线程.Thread类有多个构造函数,一般通 ...

  4. android学习-异步消息处理机制

    消息处理机制主要对象:Looper,Handler,Message(还有MessageQueue和Runnable) Looper不断从MessageQueue消息队列中取出一个Message,然后传 ...

  5. Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群

    Redis总结(五)缓存雪崩和缓存穿透等问题   前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...

  6. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  7. 【Android 开发】: Android 消息处理机制之一: Handler 与 Message

    最近几讲内容,我们学习了Android中关于多线程的一些知识,上一讲我们讲解了异步任务 AsyncTask 的操作,Android中还提供了其他的线程操作,如Handler Message Messa ...

  8. RabbitMQ学习总结 第三篇:工作队列Work Queue

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

  9. Android多线程----异步消息处理机制之Handler详解

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

随机推荐

  1. Python-用xlrd模块读取excel,数字都是浮点型,日期格式是数字的解决办法

    excel文件内容: 读取excel: # coding=utf-8 import xlrd import sys reload(sys) sys.setdefaultencoding('utf-8' ...

  2. Python——操作smb文件服务器(上传和下载)

    最近在做上传和下载,然后文件比较大和多,就用到了文件服务器,文件服务器是实体机 ,不是在本地, 然后用python 通过pysmb模块就可以直接进行操作 mac选择前往.连接服务器去查看文件服务器里都 ...

  3. 隐写工具outguess安装使用介绍

      0x00 outguess下载安装 Kail终端命令输入git clone https://github.com/crorvick/outguess 安装包随即下载到文件夹.双击打开文件夹,右键点 ...

  4. C/C++代码覆盖率统计工具:gcov&&gcovr安装和简单使用

    gcov安装 Linux ver: gcov是gcc的自带功能 属于GNU 不用特别安装 Windows ver: 在windows下安装可以使用gcov的gcc 之前试过mingw和Cygwin64 ...

  5. day25 ATM项目(第一天)

    项目的说明书 项目:ATM + 购物车 项目需求: 1.额度15000或自定义 --> 注册功能 2.实现购物商城,买东西加入购物车,调用信用卡接口结账 --> 购物功能.支付功能 3.可 ...

  6. P1050 精卫填海

    [问题描述] 发鸠之山,其上多柘木.有鸟焉,其状如乌,文首,白喙,赤足,名曰精卫,其名自詨.是炎帝之少女,名曰女娃.女娃游于东海,溺而不返,故为精卫.常衔西山之木石,以堙于东海.——<山海经&g ...

  7. Java冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序

    冒泡排序   冒泡排序是一种简单的排序算法.它重复地走访过要排序地数列,一次比较两个元素,如果它们地顺序错误就把它们交换过来.走访数列地工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. ...

  8. NIO实践-HTTP交互实现暨简版Tomcat交互内核

    今天就NIO实现简单的HTTP交互做一下笔记,进而来加深Tomcat源码印象. 一.关于HTTP 1.HTTP的两个显著特点,HTTP是一种可靠的超文本传输协议 第一.实际中,浏览器作为客户端,每次访 ...

  9. 一个通用的两级Makefile例子

    目的 进行如项目的顶层目录后,运行make,即可直接编译项目中所有的源文件,并生成最终的可执行文件 实现头文件自动依赖 添加源文件不用修改Makefile,且可以自动编译新文件 顶层目录下添加文件夹, ...

  10. 【JVM之内存与垃圾回收篇】对象实例化内存布局与访问定位

    对象实例化内存布局与访问定位 从各自具体的内存分配上来讲 new 的对象放在堆中 对象所属的类型信息是放在方法区的 方法当中的局部变量放在栈空间 这 new 的对象怎么把三块粘合到一起 就是这章的内容 ...