7

我正在编写一个小应用程序,我在其中使用 RabbitMQ 发送/接收消息。一切正常,但我正在努力解决消息持久性问题。

即使在服务器重新启动时,我也希望消息保留在队列中。我理解交换和队列级别的持久性概念,并将它们设置为 true(而不是默认为 true)。所以当我重新启动我的 RabbitMQ 服务器时,交换和队列保持不变,但队列中的消息被删除。

我正在使用 EasyNetQ.IBus 接口发送消息。

谢谢

4

3 回答 3

7

使用 RabbitMQ.Client,您可以使用 IBasicProperties 设置交付模式,可以使用 IModel.CreateBasicProperties() 方法获取。

using (IConnection conn = factory.CreateConnection())
using (IModel channel = conn.CreateModel())
{
    channel.ExchangeDeclare(exchange, ExchangeType.Direct, durable: true);
    channel.QueueDeclare(queue, durable: true, exclusive: false, autoDelete: false, arguments: null);
    channel.QueueBind(queue, exchange, routingKey, null);

    var props = channel.CreateBasicProperties();
    props.Persistent = true; // or props.DeliveryMode = 2;

    channel.BasicPublish(exchange, routingKey, props, Encoding.Default.GetBytes(message));
}
于 2016-11-22T17:58:56.010 回答
4

为了让你的消息在 RabbitMQ 中持久化,你需要添加MessageProperties.PERSISTENT_TEXT_PLAIN你的代码。

import com.rabbitmq.client.MessageProperties;

channel.basicPublish("", "task_queue",
        MessageProperties.PERSISTENT_TEXT_PLAIN,
        message.getBytes());
于 2018-05-04T05:50:35.193 回答
0

您是否尝试过启用延迟队列?“惰性队列 - 尽可能早地将其内容移动到磁盘的队列”

它可以在策略级别(我的偏好)或特定队列上启用。

完整的解释在这里https://www.rabbitmq.com/lazy-queues.html

于 2021-10-15T04:53:05.930 回答