首页 > 解决方案 > 检查消息,如果需要,在 rabbitmq 消费者中重新排队

问题描述

我正在寻找一种方法让消费者从队列中获取接收到的消息,在其上调用一个方法,然后检查任务是否完成,如果不重新排队。检查很简单,我检查消息中的一个 int 属性我遇到了问题,因为它触发了一个事件,你不能在事件内部消费,所以你不能在里面检查它......有什么想法吗?

代码:

 EventingBasicConsumer consumer = new EventingBasicConsumer(_channel);


                consumer.Received += (model, ea) =>
                {
                    var body = ea.Body;
                    var msg = Encoding.UTF8.GetString(body);
                    var message = JsonConvert.DeserializeObject<MessageWithoutUser>(msg);

                    IBot bot = _factory.GetBot(message);
                    var result = bot.Execute(message.MessageId, message.UserId, message.Likes, message.Service, message.Time);

                    if (CheckResult(result))
                    {
                        _channel.BasicConsume(queue: "messages",

                                    autoAck: true,
                                    consumer: consumer);
                    }
                    else
                    {
                        var newJsonMessage = new MessageWithoutUser { MessageId = message.MessageId, UserId = message.UserId, Likes = result, Service = message.Service, Time = message.Time };
                        var newJson = JsonConvert.SerializeObject(newJsonMessage);
                        Encoding.UTF8.GetBytes(newJson);
                        ea.Body = SerializeMessage(newJsonMessage);
                        _channel.BasicReject(ea.DeliveryTag,true);
                    }

                    Console.ReadLine();
                };

如您所见, Received 事件中有一个 .BasicConsume ,这是不可能的,这就是我想要做的,获取结果,然后检查它是 1 还是 0,然后基于该消耗或拒绝。

标签: c#.netasp.net-corerabbitmq

解决方案


  • 您可以通过以下方式确认消息_channel.BasicAck(ea.DeliveryTag, true)
  • 拒绝消息意味着重新排队相同的消息,没有办法改变已经发布的消息内容。
  • 如果你想改变重新入队的消息内容,用 拒绝它_channel.BasicReject(ea.DeliveryTag, false),rabbitmq 服务器会丢弃这条消息,然后用你自定义的内容重新发布消息。

推荐阅读