RabbitMQ消费消息分为两种:推模式和拉模式
1.推模式:可以通过持续订阅的方式来消费消息
源码:
1.1消息消费之后手动反馈ack
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body;
Run(body);
channel.BasicAck(ea.DeliveryTag, false);
};
//aotuAck 是否自动发送反馈,如果不自动反馈,需要手动反馈
channel.BasicConsume(QUEUE_NAME, false, consumer);
是否也可以这样实现
var consumer = new EventingBasicConsumer(channel);
consumer.Received += receiveFunc;
//aotuAck 是否自动发送反馈,如果不自动反馈,需要手动反馈
channel.BasicConsume(QUEUE_NAME, false, consumer);
private static void receiveFunc(object sender, BasicDeliverEventArgs ea)
{
IModel channel = sender as IModel;
var body = ea.Body;
Run(body);
channel.BasicAck(ea.DeliveryTag, false);
}
private static void Run(byte[] body)
{
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message);
}
BasicConsume()介绍:
注意:BasicConsume将信道设置为接收模式,直到取消队列的订阅为止,在接收模式期间,RabbitMQ会不断地推送消息给消费者,当然推送消息的个数还是会收到basicQos()的限制。如果只是想从队列获取单条消息而不是订阅,建议用basicGet()拉模式 。 将BasicGet()放在一个循环中代替BasicConsum()是不可取的
string BasicConsume(string queue, bool autoAck, string consumerTag, bool noLocal, bool exclusive, IDictionary<string, object> arguments, IBasicConsumer consumer);
参数:
queue:队列名称
autoAck:是否自动反馈ACK
consumerTag:消费者标签,区分不同的消费者
exclusive:是否排他
1.2消息消费之后自动反馈ACK
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body;
Run(body);
};
//aotuAck 是否自动发送反馈,如果不自动反馈,需要手动反馈
channel.BasicConsume(QUEUE_NAME, true, consumer);
其中run方法可以实现业务逻辑
private static void Run(byte[] body)
{
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message);
}
2.拉模式
源码:
BasicGetResult getResult = channel.BasicGet(QUEUE_NAME, false);
var body = getResult.Body;
Run(body);
channel.BasicAck(getResult.DeliveryTag, false);
private static void Run(byte[] body)
{
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message);
}
更多精彩请关注公众号:隔壁王小猿(gbwxy-happy)