我一直在玩RabbitMq.net和消息确认。如果消费者可以处理该消息,则可以以ack的形式发送回来。
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;
}
}
}