```
在broker端,默认是不存储priority信息的,我们需要手动开启,修改activemq.xml配置文件,在broker标签的子标签policyEntries中增加下述配置:
<policyEntry queue=">" prioritizedMessages="true"/>
不过对于“非持久化”类型的消息(如果没有被swap到临时文件),它们被保存在内存中,它们不存在从文件Paged in到内存的过程,因为可以保证优先级较高的消息,总是在prefetch的时候被优先获取,这也是“非持久化”消息可以担保消息发送顺序的优点。
Broker在收到Producer的消息之后,将会把消息cache到内存,如果消息需要持久化,那么同时也会把消息写入文件;如果通道中Consumer的消费速度足够快(即积压的消息很少,尚未超过内存限制,我们通过上文能够知道,每个通道都可以有一定的内存用来cache消息),那么消息几乎不需要从存储文件中Paged In,直接就能从内存的cache中获取即可,这种情况下,priority可以担保“全局顺序”;不过,如果消费者滞后太多,cache已满,就会触发新接收的消息直接保存在磁盘中,那么此时,priority就没有那么有效了。
在Queue中,prefetch的消息列表默认将会采用“轮询”的方式(roundRobin,注意并不是roundRobinDispatch)[备注:因为Queue不支持任何DispatchPolicy],依次添加到每个consumer的pending buffer中,比如有m1-m2-m3-m4四条消息,有C1-C2两个消费者,那么: m1->C1,m2->C2,m3->C1,m4->C2。这种轮序方式,会对基于权重的消息发送有些额外的影响,假如四条消息的权重都不同,但是(m1,m3)->C1,事实上m2的权重>m3,对于C1而言,它似乎丢失了“顺序性”。
```
- JMS vs AMQP
- ActiveMQ
- 安装
- 简介
- 知识点
- 点对点
- 发布订阅
- 对比
- 安全认证
- 持久化
- Api
- Productor
- 发送消息
- 消息有效期
- 消息优先级
- 开启
- 严格顺序
- 强顺序
- Consumer
- 消息确认
- 消息的过滤
- 客户端
- java
- 点对点
- 生产者
- 消费者
- 发布订阅
- 生产者
- Springboot
- 配置
- QueueConfig
- 生产者
- 消费者
- 集群
- RabbitMQ
- 安装
- 主要概念
- 消息模型
- 基本消息模型
- 简介
- java
- 消费者
- 生产者
- 工具类
- work消息模型
- 简介
- java
- 消费者
- 生产者
- 订阅模型-Fanout
- 简介
- java
- 生产者
- 消费者
- 订阅模型-Direct
- 简介
- java
- 生产者
- 消费者
- 订阅模型-Topic
- 简介
- java
- 生产者
- 消费者
- 持久化
- Spring-AMQP
- 消费者
- 生产者