c# - 检查消息,如果需要,在 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,然后基于该消耗或拒绝。
解决方案
- 您可以通过以下方式确认消息
_channel.BasicAck(ea.DeliveryTag, true)
- 拒绝消息意味着重新排队相同的消息,没有办法改变已经发布的消息内容。
- 如果你想改变重新入队的消息内容,用 拒绝它
_channel.BasicReject(ea.DeliveryTag, false)
,rabbitmq 服务器会丢弃这条消息,然后用你自定义的内容重新发布消息。
推荐阅读
- teamcity - OctopusDeploy:创建发布步骤失败并出现错误“提要返回了意外的状态代码 '403'”
- amazon-web-services - 如何禁用在 S3 中公开存储桶
- python - 如何使用python在数据框中将列中的每个元素移动n个范围?
- filter - Google表格中带有过滤功能的公式解析错误
- java - Arraylist 中的数据重复
- oracle - Devart dotConnect for Oracle 不会与 Visual Studio 2017 安装/集成
- python - 如何加载使用纯张量流训练的 tf.keras 模型
- java - 如何添加显示更多功能以获取 firebase 数据库?
- julia - 使用 eigs 从一组复杂的特征值中恢复具有最大实部的特征值
- python-3.x - 遍历文件夹并将png转换为jpg