我使用IMessageSessionAsyncHandler
的自定义实现来从分区服务总线队列中读取。分区数量相当大,队列中写入的消息量也相当大。 MaxConcurrentSessions
设置为默认值。
假设在分区上统一分发消息,我试图最大化已处理消息的数量。 MessageWaitTimeout
设置为1秒,以避免在分区上没有新消息时浪费时间。
现在我要做的是在处理一定数量的消息时强制关闭会话,以便另一个会话读者有机会处理其消息(在OnMessageAsync
方法中)。在关闭会话之前,我需要模拟会话中已读但尚未完成的所有消息的完成(Autocomplete
设置为true)。换句话说,模拟Autocomplete
触发器的动作。你知道有没有办法做到这一点?
如果我将Autocomplete
设置为false并手动完成每条消息,则性能会降至不可接受的水平(同时完成的批处理消息确实会提高读取量)。
public async Task OnMessageAsync(MessageSession session, BrokeredMessage message)
{
try
{
_callback(message);
if (++_processedMessages >= n)
{
//simulate the action of Autocomplete for the batched msg
await OnCloseSessionAsync(session);
}
}
catch (Exception ex)
{
Logger.Error(ex, "Error handling brokered message");
}
}