【问题标题】:Loss of messages in RabbitMQRabbitMQ 中的消息丢失
【发布时间】:2014-11-06 15:00:49
【问题描述】:

我尝试构建持久消息队列,每条消息都有一些延迟。在 Java 代码中它看起来像这样:

    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();

    channel.exchangeDeclare("WorkExchange", "direct");
    channel.queueDeclare("WorkQueue", true, false, false, null);
    channel.queueBind("WorkQueue", "WorkExchange", "");

    Map<String, Object> args = new HashMap<>();
    args.put("x-dead-letter-exchange", "WorkExchange");

    channel.exchangeDeclare("RetryExchange", "direct");
    channel.queueDeclare("RetryQueue", true, false, false, args);
    channel.queueBind("RetryQueue", "RetryExchange", "");

    channel.confirmSelect();
    BasicProperties properties = new BasicProperties();
    properties.setDeliveryMode(2);
    properties.setExpiration("120000");
    channel.basicPublish("RetryExchange", "", properties, "Hello world!".getBytes());
    channel.waitForConfirmsOrDie();
    connection.close();

但是,我在持久性方面遇到了一些问题。当我停止服务器时,等待一段时间并重新启动它,必须移动到 WorkQueue 的消息就会消失。我做错了什么?还是设计使然?

【问题讨论】:

    标签: java persistence rabbitmq message-queue


    【解决方案1】:

    但是,我在持久性方面遇到了一些问题。当我停止服务器时,等待一段时间然后重新启动它, 必须移动到 WorkQueue 的消息就会消失。我做错了什么?还是设计使然?

    您应该使用 MessageProperties 来使您的消息持久化。

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

    你当前的代码 `channel.queueDeclare("RetryQueue", true, false, false, args);将使队列持久化而不是消息。

    更多RabbitMQ Doc

    【讨论】:

      猜你喜欢
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多