【问题标题】:Message deleted automatically RabbitMQ消息自动删除 RabbitMQ
【发布时间】:2015-11-17 08:33:51
【问题描述】:

我使用 RabbitMQ 来存储消息。我注意到应用程序重新启动时消息被删除。

我在同一个应用程序中有生产者和消费者。

请按以下方式查找生产者和消费者。我使用了持久队列和持久消息。

因此,如果队列只有一个消费者并且当前没有消费,那么队列消息将被删除。是这样吗?

制片人:

public static void PublishMessage(RequestDto message, string queueName)
    {
        var factory = new ConnectionFactory() { HostName = Config.RabbitMqHostName, Port = Config.RabbitMqPortNumber };

        using (var connection = factory.CreateConnection())
        {
            using (var channel = connection.CreateModel())
            {
                channel.QueueDeclare(queueName, true, false, false, null);

                var properties = channel.CreateBasicProperties();
                properties.SetPersistent(true);
               // properties.DeliveryMode = 2; I have used this too.

                string serializesMessage = Utility.SerializeSoapObject(message);

                var messageBytes = Encoding.UTF8.GetBytes(serializesMessage);

                channel.BasicPublish("", queueName, properties , messageBytes);

                Log.Info("Record added into queue : \nMessage: " + serializesMessage);
            }
        }
    }

消费者:

var factory = new ConnectionFactory() { HostName = Config.RabbitMqHostName, Port = Config.RabbitMqPortNumber };
            using (var connection = factory.CreateConnection())
            {
                using (var channel = connection.CreateModel())
                {
                    channel.QueueDeclare(Config.RabbitMqQueueName, true, false, false, null);

                    var consumer = new QueueingBasicConsumer(channel);
                    channel.BasicConsume(Config.RabbitMqQueueName, true, consumer);

                    while (DoProcessMessage())
                    {
                          try
                            {
                                List<RequestDto> messages = GetMessagesInBatch(consumer);

                                if (messages.Count > 0)
                                {
                                    ProcessMessageInParallel(messages);
                                }
                                else
                                {
                                    Producer.FillRequestMessages();
                                }
                            }
                            catch (Exception exception)
                            {
                                Log.Error("StartConsumer - Failed to process message from RabbitMq Error: " + exception.Message, exception);
                            }

                    }
                }
            }
        }
        catch (Exception exception)
        {
            Log.Error(exception.Message, exception);
        }

    private bool DoProcessMessage()
    {
        return Config.MaxRequestPerDayCount > 1000;
    }

如果有人可以帮忙。

【问题讨论】:

  • 你能通过 RabbitMQ 管理面板确认队列是持久的并且其中的消息有 delivery_mode=2 吗?是否通过更改任何逻辑来删除或清除应用程序关闭或启动时的队列?

标签: c# .net rabbitmq


【解决方案1】:

您似乎将 noAck = true 传递给 basicConsume 函数: https://www.rabbitmq.com/releases/rabbitmq-java-client/v1.7.0/rabbitmq-java-client-javadoc-1.7.0/com/rabbitmq/client/Channel.html#basicConsume(java.lang.String,布尔值,com.rabbitmq.client.Consumer)

在no ack模式下,RabbitMQ会将消息发送给消费者,并立即从队列中删除。

【讨论】:

    猜你喜欢
    • 2018-08-04
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 2015-12-20
    • 1970-01-01
    • 2018-07-26
    相关资源
    最近更新 更多