【问题标题】:RabbitMQ messages are in Unacked stateRabbitMQ 消息处于 Unacked 状态
【发布时间】:2019-03-19 06:45:19
【问题描述】:

尝试侦听从 RMQ 接收到的消息,消息已被接收,但队列中的消息仍处于未确认状态。

           ConnectionFactory factory = new ConnectionFactory();// assign factory details

           IConnection _connection = factory.CreateConnection();
           IModel  _model = _connection.CreateModel();
           _model.ExchangeDeclare("RmqExchangeName", "topic", true);
           var consumer = new EventingBasicConsumer(_model);

            consumer.Received += (object ch, BasicDeliverEventArgs ea) =>
            {
                   var message = Encoding.Default.GetString(ea.Body);

                    MemoryStream payloadstream = new MemoryStream(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new UriDto { Url = message })));
                    Helper.Log("Start  Message");
                    // Do something with payloadstream
                    Helper.Log("Sent  Message");
                    _model.BasicAck(ea.DeliveryTag, false);
             };
           _model.BasicConsume(RmqQueueName, false, consumer);

【问题讨论】:

  • 开始消息和发送消息正在被记录?.. _model.BasicAck(ea.DeliveryTag, false);这是负责确认的线路。但是,在确认过程中可能会有一些延迟。
  • 刚刚检查,消息处理正常,除了队列状态未被确认。
  • 您需要在完成后单独确认每条消息,或者将 auto ack 设置为 true(您的 consume 方法中的 false 标志)

标签: c# rabbitmq


【解决方案1】:

您需要将您的交换绑定到一个队列才能使用您的消息。

       ConnectionFactory factory = new ConnectionFactory();// assign factory details
       IConnection _connection = factory.CreateConnection();
       IModel  _model = _connection.CreateModel();
       _model.ExchangeDeclare("RmqExchangeName", "topic", true);
       _model.QueueBind(queue: queueName,exchange: "RmqExchangeName",routingKey: "");
       var consumer = new EventingBasicConsumer(_model);

        consumer.Received += (object ch, BasicDeliverEventArgs ea) =>
        {
               var message = Encoding.Default.GetString(ea.Body);

                MemoryStream payloadstream = new MemoryStream(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new UriDto { Url = message })));
                Helper.Log("Start  Message");
                // Do something with payloadstream
                Helper.Log("Sent  Message");
                _model.BasicAck(ea.DeliveryTag, false);
         };
       _model.BasicConsume(RmqQueueName, true, consumer);

【讨论】:

  • 当 BasicConsume:autoAck 设置为 true 时,队列中的消息不会被读取。
  • @VivekRanjan 你确定在检索数据和处理消息时没有错误。
  • @VivekRanjan 请你试试新代码,当你绑定到你的交易所时,你需要提供你的队列名称
猜你喜欢
  • 1970-01-01
  • 2015-11-02
  • 2018-07-30
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多