我一直在玩RabbitMq.net和消息致谢。 如果消费者能够处理消息,您可以以
的形式发回一个确认channel.BasicAck(ea.DeliveryTag, false);
将把它从队列中删除。
但是如果邮件无法处理呢?也许是暂时的中断,你不希望从队列中取出的消息只是放在后面并继续下一条消息?
我尝试过使用
channel.BasicNack(ea.DeliveryTag, false, true);
但下一次仍然会收到相同的消息,而不是移动到队列中的下一条消息
我的完整代码是
class Program
{
private static IModel channel;
private static QueueingBasicConsumer consumer;
private static IConnection Connection;
static void Main(string[] args)
{
Connection = GetRabbitMqConnection();
channel = Connection.CreateModel();
channel.BasicQos(0, 1, false);
consumer = new QueueingBasicConsumer(channel);
channel.BasicConsume("SMSQueue", false, consumer);
while (true)
{
if (!channel.IsOpen)
{
throw new Exception("Channel is closed");
}
var ea = consumer.Queue.Dequeue();
string jsonified = Encoding.UTF8.GetString(ea.Body);
var message = JsonConvert.DeserializeObject<SmsRecords>(jsonified);
if (ProcessMessage())
channel.BasicAck(ea.DeliveryTag, false);
else
channel.BasicNack(ea.DeliveryTag, false, true);
}
}
private static bool ProcessMessage()
{
return false;
}
public static IConnection GetRabbitMqConnection()
{
try
{
var connectionFactory = new ConnectionFactory
{
UserName = "guest",
Password = "guest",
HostName = "localhost"
};
return connectionFactory.CreateConnection();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return null;
}
}
}
答案 0 :(得分:14)
这就是我的公司这样做:如果一条消息失败(出于任何原因),我们将消息放入一个保持队列,在那里它停留10秒钟,然后将其重新放回队列中进行重试。我们这个循环最多循环10次,如果消息被忽略了10次,那么我们认为这是一个我们无法恢复的失败,我们把它放入一个永久的死信队列进行调查。
这是图表: