RabbitMQ中的消息持久化

9
我正在编写一个小应用程序,其中使用了RabbitMQ来发送/接收消息。一切都运行良好,但是我在处理消息持久性方面遇到了困难。
我希望消息即使在服务器重新启动时也能保留在队列中。我理解交换机和队列级别的耐久性概念,并将它们设置为true(或者它们默认为true)。因此,当我重新启动RabbitMQ服务器时,交换机和队列仍然完好无损,但是队列中的消息被删除了。
我正在使用EasyNetQ.IBus接口发送消息。
谢谢

你能展示一些代码吗?比如在哪里设置你的通道/队列等等。 - Alex
您是否使用delivery_mode消息属性使消息本身持久化? - Evk
@Jay,我看到除非你在连接字符串中明确设置“persistentMessages=false”,否则默认情况下应该为true,并且它应该使用正确的delivery_mode(=2)。因此,我们需要更多的信息来自你。 - Evk
@Evk 我之前尝试过这个,但没有帮助:_bus = RabbitHutch.CreateBus("host=abc;virtualHost=def;username=a;password=b;persistentMessages=true");。我已经阅读过默认情况下持久性为真,但在我的情况下似乎并非如此。现在我正在手动设置 message.properties.DelievryMode = 2 并测试。 - Jay
1
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/90336/discussion-between-evk-and-jay。 - Evk
显示剩余2条评论
4个回答

10

通过使用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));
}

4
注意,IBasicProperties接口有一个Persistent属性。因此你可以使用props.Persistent = true;来设置该属性。 - Hamish

4
为了使您的消息在RabbitMQ中持续存在,您需要在代码中添加MessageProperties.PERSISTENT_TEXT_PLAIN
import com.rabbitmq.client.MessageProperties;

channel.basicPublish("", "task_queue",
        MessageProperties.PERSISTENT_TEXT_PLAIN,
        message.getBytes());

我相信它能工作,但问题是关于C#而不是Java。 - Christian Davén

1
在绑定队列后添加这两行代码:
var properties = model.CreateBasicProperties();
properties.Persistent = true;

0

你尝试过启用懒队列吗? "懒队列 - 尽可能早地将其内容移动到磁盘的队列"

它可以在策略级别(我更喜欢)或特定队列上启用。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接