前言:

        由于所在开发项目中已经有异步处理需求的开发,而自己对于MQ与Java信息交互知识比较薄弱,故在上找博客自我学习,参考自,写的十分详细明了,同时也想把自我学习过的笔记以及问题进行记录,也方便以后能够回顾,大概将本系列文章分为如下部分:

1.RabbitMQ相关概念介绍
2.RabbitMQ Java Client使用
3.使用Spring AMQP整合RabbitMQ
4.使用@RabbitListener注解进行消息消费

5.RabbitMQ的异常处理
6.RabbitMQ消息可靠性保障
7.RabbitMQ的常用属性介绍
8.使用RabbitMQ进行异步RPC通信
9.使用SpringBoot整合RabbitMQ

概念介绍:

       

java rabbitmq 发送数据 rabbitmq教程 java_消息发送

流程介绍:

        RabbitMQ的主要流程:生产者将消息发送到交换机(Exchange),交换机根据不同路由规则将消息路由到已经绑定到该交换机且符合路由规则的队列中去,消费者通过监听队列来获取消息。注:交换机不存储消息,默认情况下消息如果没有被正确路由到相应队列,该消息将会被丢弃。

 

消息:

      消息是服务器与应用程序之间传送的数据,由Properties和Payload(Body)组成,Message具有如下属性 :

java rabbitmq 发送数据 rabbitmq教程 java_RabbitMQ_02

属性

属性描述

Routing key

Routing key (用来匹配队列Queue)

Delivery mode

是否持久化 :Persistent持久化   /  Non-persistent不持久化

Headers

头信息,是由一个或多个键值对组成的,是AMQP协议留给AMQP实现做扩展使用的

Properties

AMQP提供的部分属性

Payload

消息体

 

队列:

        队列是消息的载体,每个消息都应该被投入一个或多个队列,Queue具有如下属性 :

java rabbitmq 发送数据 rabbitmq教程 java_java rabbitmq 发送数据_03

 

属性名

属性描述

Virtual host

虚拟主机

Name

队列名称,同一个Virtual host下不能有相同的Name

Durability

是否持久化,Durable:是 Transient:否

Auto delete

如果该队列没有任何订阅的消费者的话,该队列会被自动删除

Arguments

参数,是AMQP协议留给AMQP实现做扩展使用的

 

绑定:

       RabbitMQ中的绑定通常是指交换机与队列的绑定关系(交换机与交换机绑定极少使用),Binding有如下属性 

java rabbitmq 发送数据 rabbitmq教程 java_持久化_04

属性名

属性描述

To queue / To Exchange

队列名称 / 交换机名称

Routing key

Routing key

Arguments

路由参数(只有Headers Exchange是根据参数路由的,故只有Headers Exchange需要设置该参数)

 

Default Exchange不能进行Binding也不需要进行Binding

除了Default Exchange之外其他任何Exchange都需要和Queue进行Binding,否则无法进行消息路由

Direct Exchange、Topic Exchange进行Binding的时候需要指定Routing key

Fanout Exchange、Headers Exchange进行Binding的时候不需要指定Routing key
 

交换机:

java rabbitmq 发送数据 rabbitmq教程 java_持久化_05

属性

属性描述

Virtual host

虚拟主机

Name

交换机名称,同一个Virtual host下不能有相同的Name

Type

交换机类型

Durability

是否持久化,Durable:是 Transient:否

Auto delete

当最后一个绑定被删除后,该交换机将被删除

Internal

是否是内部专用exchange,是的话就意味着我们不能往exchange里面发送消息

Arguments

参数,是AMQP协议留给AMQP实现做扩展使用的

       RabbitMQ内置一个名称为空字符串的默认交换机,它根据Routing key将消息路由到与队列名与Routing key完全相等的队列中

 

扇形交换机:

java rabbitmq 发送数据 rabbitmq教程 java_Routing_06

        扇形交换机(Fanout Exchange)会把能接受到的消息全部发送给绑定到自己身上的队列,扇形交换机在路由转发的时候忽略Routing Key。因为广播不需要思考所以扇形交换机处理消息的速度是所有交换机类型里面最快的

 

直连交换机:

java rabbitmq 发送数据 rabbitmq教程 java_RabbitMQ_07

直连交换机(Direct Exchange)是一种带路由功能的交换机,它将消息中的Routing key与该交换机关联的所有Binding中的Routing key进行比较,如果完全相等则将消息发送到Binding对应的队列中,适用场景:根据任务的优先级把消息发送到对应的队列中,分配更多资源处理优先级高的队列

 

主题交换机:

java rabbitmq 发送数据 rabbitmq教程 java_Routing_08

       主题交换机(Topic Exchange)与直连交换机相比主题交换机的Routing key支持通配符,它将消息中的Routing key与该交换机关联的所有Binding中的Routing key进行比较,如果匹配上对应的匹配规则则将消息发送到Binding对应的队列中

*:匹配一个单词
#:匹配0个或多个单词

如果Binding中的Routing key不包含*,#,则表示相等转发,类似于Direct Exchange 
如果Binding中的Routing key为#或者#.#,则表示全部转发,类似于Fanout Exchange

 

首部交换机:

        首部交换机(Headers Exchange)[不常用 了解即可]在进行路由转发的时候会忽略Routing Key,它将消息中的Headers与该交换机关联的所有Binding中的参数进行匹配,如果匹配上则将消息发送到Binding对应的队列中。它的匹配规则有下列两种类型

匹配规则
x-match = any则表示只要有键值对匹配就能转发消息
x-match = all则表示所有的键值对都匹配才能转发消息

注:Binding的时候至少需要指定两个参数,其中一个是x-match = all/any