Rabbitmq 使用 .NET 使用单个同步调用检索多条消息
Posted
技术标签:
【中文标题】Rabbitmq 使用 .NET 使用单个同步调用检索多条消息【英文标题】:Rabbitmq retrieve multiple messages using single synchronous call using .NET 【发布时间】:2015-11-25 08:44:58 【问题描述】:有没有办法使用 .NET 使用单个同步调用来接收多条消息? 我见过question 并找到了java 类com.rabbitmq.client.QueueingConsumer,但我还没有在.NET 命名空间中找到这样的客户端类(RabbitMQ.Client、RabbitMQ.Client.Events)
【问题讨论】:
您能否详细描述一下“单个同步调用”的含义? 嗯,更正确:我想接收一个带有一批消息的事件(将客户端配置为最大批量大小和超时)。希望这个解释更清楚 我就是这么想的。消息批处理通常与正确的设计实践背道而驰。如果您发现需要批处理,也许您想改用共享数据库? 【参考方案1】:您可以使用BasicQoS.PrefetchCount
检索任意数量的消息:
var model = _rabbitConnection.CreateModel();
// Configure the Quality of service for the model. Below is how what each setting means.
// BasicQos(0="Dont send me a new message untill I’ve finshed", _fetchSize = "Send me N messages at a time", false ="Apply to this Model only")
model.BasicQos(0, fetchSize, false);
注意:如果您设置 fetchSize = 20,那么它将检索当前在队列中的前 20 条消息。但是,一旦队列被清空,它不会等待 20 条消息在队列中建立,它会尽快开始消耗它们,最多一次 20 个。
希望这是有道理的。
【讨论】:
【参考方案2】:感谢您的回答,但我找到了我要找的课程:RabbitMQ.Client.QueueingBasicConsumer 简单的实现是:
IEnumerable<T> Get(int maxBatchCount, int getMessageTimeout, int getBatchTimeout)
var result = new List<T>();
var startTime = DateTime.Now;
while (result.Count < maxBatchCount)
var deliverEventArgs = new BasicDeliverEventArgs();
if ((_consumer as QueueingBasicConsumer).Queue.Dequeue(GetMessageTimeout, out deliverEventArgs))
var entry = ContractSerializer.Deserialize<T>(deliverEventArgs.Body);
result.Add(entry);
_queue.Channel.BasicAck(deliverEventArgs.DeliveryTag, false);
else
break;
if ((DateTime.Now - startTime) >= TimeSpan.FromMilliseconds(getBatchTimeout))
break;
return result;
当然,你可以用Environment.TickCount
代替DateTime.Now
【讨论】:
以上是关于Rabbitmq 使用 .NET 使用单个同步调用检索多条消息的主要内容,如果未能解决你的问题,请参考以下文章
springboot | Rabbitmq 实现RPC方式 远程同步调用
springboot | Rabbitmq 实现RPC方式 远程同步调用