消息持久化
如何保障RabbitMQ 服务停掉以后消息生产者发送过来的消息不丢失。默认情况下 RabbitMQ 退出或由于某种原因崩溃时,会忽视队列和消息,除非告知它不要这样做。确保消息不会丢失需要做两件事:需要将队列和消息都标记为持久化。
一、队列持久化
创建的队列如果是非持久化的,如果rabbitmq重启队列就会被删除。
如果需要持久化只要把durable设置为true就可以把队列持久化了。
Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,
Map<String, Object> arguments) throws IOException;
以上代码在声明队列时只要将第二个参数改为true即可。
在修改时,如果队列之前不是持久化的队列,在将参数durable设置为true后会出现错误。
需要将队列删除才能继续设置
进入到管理界面 http://localhost:15672/#/
‘选择Queue
选择要删除的队列
重新创建队列
// 声明一个持久队列
String queueName = "myQueue";
boolean durable = true;//队列持久化
boolean exclusive = false;
boolean autoDelete = false;
Map<String, Object> arguments = null; // 如果不需要额外的参数,可以设置为null
Queue.DeclareOk queueDeclareOk = channel.queueDeclare(queueName, durable, exclusive, autoDelete, arguments);
“D”表示是持久化队列
二、消息持久化
在生产者代码中设置如下属性
MessageProperties.PERSISTENT_TEXT_PLAIN
channel.basicPublish("",QUEUE_NAME,MessageProperties.PERSISTENT_TEXT_PLAIN,messageC1.getBytes());
```java
exchange:交换机名称。如果为空字符串(“”),则表示使用默认交换机。默认交换机是一个特殊的交换机,没有名称,你不需要显式地声明它。
routingKey:路由键。这是消息选择队列的关键字。如果交换机和队列之间有绑定,并且绑定的路由键与这里提供的路由键相匹配,那么消息将被投递到对应的队列中。QUEUE_NAME是你为队列定义的名称,通常情况下,队列名称就是路由键。
basicProperties:消息属性。这些属性可以指定消息的持久性、消息的优先级、内容类型等。MessageProperties.PERSISTENT_TEXT_PLAIN是表示消息是持久的
body:消息体。这是要发送的消息的实际内容。在这里,messageC1.getBytes()表示将messageC1对象转换为字节数组,以便作为消息体发送。