目的
验证没有镜像的情况下队列的持久化和消息的持久化。
环境
实验室环境的 3 台 Rabbit MQ 服务器,已经配置好集群,没有做镜像。
代码相关
5个参数意义分别是:1、队列名 2、重启后是否重建队列 3、是否专有 4、是否自动删除 5、map参数
声明队列:channel.QueueDeclare("Q1", durable(boolean),exclusive(boolean),autoDelete(boolean),null);
MessageProperties.PERSISTENT_TEXT_PLAIN 表示消息为持久化
发布消息:channel.basicPublish("", QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, prompt.getBytes());
过程
1 查看集群情况
$ rabbitmqctl cluster_status
Cluster status of node 'rabbit@TK-RABBITMQ3' ...
[{nodes,[{disc,['rabbit@TK-RABBITMQ2','rabbit@TK-RABBITMQ1','rabbit@TK-RABBITMQ3']}]},
{running_nodes,['rabbit@TK-RABBITMQ1','rabbit@TK-RABBITMQ2','rabbit@TK-RABBITMQ3']},
{cluster_name,<<"rabbit@TK-RABBITMQ1">>},
{partitions,[]},
{alarms,[{'rabbit@TK-RABBITMQ1',[]},{'rabbit@TK-RABBITMQ2',[]},{'rabbit@TK-RABBITMQ3',[]}]}]
2 查看时候已有镜像,有的话删除。
3 使用代码新建一个name为test.1 Node为rabbit@TK-RABBITMQ1的队列,声明队列第二个参数设置为true,发布消息第二个参数设置为MessageProperties.PERSISTENT_TEXT_PLAIN,发送10条消息。
使用代码新建一个name为test.2 Node为rabbit@TK-RABBITMQ1的队列,声明队列第二个参数设置为true,发布消息第二个参数设置为null,发送10条消息。
使用代码新建一个name为test.3 Node为rabbit@TK-RABBITMQ1的队列,声明队列第二个参数设置为false,发布消息第二个参数设置为MessageProperties.PERSISTENT_TEXT_PLAIN,发送10条消息。
使用代码新建一个name为test.4 Node为rabbit@TK-RABBITMQ1的队列,声明队列第二个参数设置为false,发布消息第二个参数设置为null,发送10条消息。
4 查看队列信息
$ rabbitmqctl list_queues name messages_ready durable
Listing queues ...
test.1 10 true
test.4 10 false
test.2 10 true
test.3 10 false
5 停掉 TK-RABBITMQ1 节点
$ rabbitmqctl stop_app
Stopping node 'rabbit@TK-RABBITMQ1' ...
6 此时再用 rabbitmqctl start_app 命令启动
7 查看队列情况
$ rabbitmqctl list_queues name messages_ready durable
Listing queues ...
test.1 10 true
test.2 0 true
此时发现声明队列的第二个参数设置为为 false 的队列全部不存在了,发布消息第二个参数设置为null的消息全部丢失。
结论
想要持久化消息至少需要如下设置
- 声明队列 durable 参数为true
channel.QueueDeclare("Q1", durable(boolean),exclusive(boolean),autoDelete(boolean),null); - 发布消息Delivery Mode 设置成2,也就是第三个参数设置为 MessageProperties.PERSISTENT_TEXT_PLAIN
channel.basicPublish("", QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, prompt.getBytes());
更多实验可点击:Rabbitmq 实验