5.两种模式
5.1.Confirm介绍
消息的confirm确认机制,是指生产者投递消息后,到达了消息服务器Broker里面的exchange交换机,则会给生产者一个应答,生产者接收到应答,用来确定这条消息是否正常的发送到Broker的exchange中,这也是消息可靠性投递的重要保障
5.2.Confirm使用
5.2.1.环境搭建
①选择依赖
②修改启动类
③修改配置
④绑定交换机
5.2.2.普通写法
①回调类编写
②发送消息
③访问测试
不管是否正确的将消息发送到交换机,交换机都会返回一个结果
错误时
正确时
5.2.3.匿名内部类写法
①发送消息
在发送消息直接编写回调函数即可
②测试
错误时
正确时
5.2.4.lambda写法
①发送消息
在发送消息直接编写回调函数即可
②测试
错误时
正确时
5.3.Return介绍
rabbitmq 整个消息投递的路径为:producer —> exchange —> queue —> consumer
消息从producer到exchange 则会返回一个confirmCallback(confirm模式);
消息从exchange到queue投递失败则会返回一个returnCallback(return模式);
5.4.Return使用
和确认模式一样,可以写成匿名内部类,lambda表达式等写法
5.4.1.选择依赖
5.4.2.修改启动类
5.4.3.修改配置
5.4.4.编写回调函数类
5.4.5.发送消息
5.4.6.测试
6.交换机和队列参数
交换机和队列是在发送消息之后才进行创建
6.1.交换机参数
1.Name:交换机名字
2.Type:交换机类型,有direct, topic, fanout, headers四种
3.Durability:持久化,声明交换机是否持久化,代表交换机在服务器重启后是否还存在
4.Auto delete:是否自动删除,曾经有队列绑定到该交换机,后来解绑了,那就会自动删除该交换机
5.Internal:内部使用的,如果是yes,客户端无法直接发消息到此交换机,它只能用于交换机与交换机的绑定
6.Arguments:只有一个取值alternate-exchange,表示备用交换机
6.2.备用交换机
6.2.1.备用交换机使用场景
当消息经过交换器准备路由给队列的时候,发现没有对应的队列可以投递信息,在rabbitmq中会默认丢弃消息,如果我们想要监测哪些消息被投递到没有对应的队列,我们可以用备用交换机来实现,可以接收备用交换机的消息,然后记录日志或发送报警信息。
备用交换机一般使用fanout交换机
p指定的路由key为hello,但是正常的交换机指定的路由key是info,所以正常交换机要指定一个备用交换机(使用fanout不用指定路由key)
6.2.2.使用
①选择依赖
②修改配置
③修改启动类
④发送消息
⑤绑定交换机
⑥访问测试
路由key错误就会进入到备用交换机
6.3.队列参数
Type:队列类型
Name:队列名称
Durability:声明队列是否持久化,代表队列在服务器重启后是否还存在
Autodelete: 是否自动删除,如果为true,当没有消费者连接到这个队列的时候,队列会自动删除
Exclusive:exclusive属性的队列只对首次声明它的连接可见,并且在连接断开时自动删除;基本上不设置它,设置成false
Arguments:队列的其他属性,例如指定DLX(死信交换机等)
-
x-expires:Number(单位毫秒)
- 当Queue(队列)在指定的时间未被访问,则队列将被自动删除
-
x-message-ttl:Number
- 发布的消息在队列中存在多长时间后被取消
-
x-overflow:String
- 在死信队列的时候使用过
- 队列溢出行为,当达到队列的最大长度时,消息会发生什么,有效值为Drop Head或Reject Publish
- Drop Head:当队列已满时,新消息将排在队列的“头部”,旧的消息将从“尾部”开始删除。
- Reject Publish:当队列已满时,RabbitMQ 将拒绝任何请求将新消息发布到队列中。
-
x-max-length:Number
- 队列所能容下消息的最大长度,当超出长度后,新消息将会覆盖最前面的消息,类似于Redis的LRU算法
-
x-single-active-consumer:默认为false
- 是否激活单一的消费者,也就是该队列只能有一个消息者消费消息;
-
x-max-length-bytes:Number
- 限定队列的最大占用空间,当超出后也使用类似于Redis的LRU算法
-
x-dead-letter-exchange:String
- 指定队列关联的死信交换机,有时候我们希望当队列的消息达到上限后溢出的消息不会被删除掉,而是走到另一个队列中保存起来
-
x-dead-letter-routing-key:String
- 指定死信交换机的路由键,一般和6一起定义
-
x-max-priority:Number(0-255取值范围)
-
如果将一个队列加上优先级参数,那么该队列为优先级队列
-
给消息加上优先级属性,通过优先级特性,将一个队列实现插队消费
MessageProperties messageProperties=new MessageProperties(); messageProperties.setPriority(8);
-
-
x-queue-mode:String(理解下即可)
- 队列类型x-queue-mode=lazy懒队列,在磁盘上尽可能多地保留消息以减少RAM使用,如果未设置,则队列将保留内存缓存以尽可能快地传递消息;
-
x-queue-master-locator:String(用的较少)
- 在集群模式下设置队列分配到的主节点位置信息