我正在使用启用了会话的服务总线队列,并且我发送了5条具有相同SessionId的消息。我的接收代码使用AcceptMessageSessionAsync
获取会话锁定,以便它将接收该会话的所有消息。然后,它使用session.ReceiveBatchAsync
尝试获取会话的所有消息。然而,它似乎只获得第一条消息,然后当另一次尝试时,它获得所有其他消息。你应该能够看到两批之间差距差不多一分钟,即使所有这些消息都是一次性发送的:
Session started:AE8DC914-8693-4110-8BAE-244E42A302D5
Message received:AE8DC914-8693-4110-8BAE-244E42A302D5_1_08:03:03.36523
Session started:AE8DC914-8693-4110-8BAE-244E42A302D5
Message received:AE8DC914-8693-4110-8BAE-244E42A302D5_2_08:03:04.22964
Message received:AE8DC914-8693-4110-8BAE-244E42A302D5_3_08:03:04.29515
Message received:AE8DC914-8693-4110-8BAE-244E42A302D5_4_08:03:04.33959
Message received:AE8DC914-8693-4110-8BAE-244E42A302D5_5_08:03:04.39587
我处理这些的代码是WebJob中的一个函数:
[NoAutomaticTrigger]
public static async Task MessageHandlingLoop(TextWriter log, CancellationToken cancellationToken)
{
var connectionString = ConfigurationManager.ConnectionStrings["ServiceBusListen"].ConnectionString;
var client = QueueClient.CreateFromConnectionString(connectionString, "myqueue");
while (!cancellationToken.IsCancellationRequested)
{
MessageSession session = null;
try
{
session = await client.AcceptMessageSessionAsync(TimeSpan.FromMinutes(1));
log.WriteLine("Session started:" + session.SessionId);
foreach (var msg in await session.ReceiveBatchAsync(100, TimeSpan.FromSeconds(5)))
{
log.WriteLine("Message received:" + msg.MessageId);
msg.Complete();
}
}
catch (TimeoutException)
{
log.WriteLine("Timeout occurred");
await Task.Delay(5000, cancellationToken);
}
catch (Exception ex)
{
log.WriteLine("Error:" + ex);
}
}
}
这是从我的WebJob Main
使用:
JobHost host = new JobHost();
host.Start();
var task = host.CallAsync(typeof(Functions).GetMethod("MessageHandlingLoop"));
task.Wait();
host.Stop();
为什么我不会在ReceiveBatchAsync
的第一次通话中收到我的所有消息?
答案 0 :(得分:2)
Hillary Caituiro Monge在MSDN论坛上回答了这个问题:https://social.msdn.microsoft.com/Forums/azure/en-US/9a84f319-7bc6-4ff8-b142-4fc1d5f1e2fa/service-bus-session-receivebatchasync-only-receiving-1-message?forum=servbus
Service Bus不保证您将收到消息计数 即使您的队列包含或更多,也指定接收批处理。有 说,您可以更改您的代码以尝试获取100条消息 第一次电话,购买时请记住您的应用程序不应该假设 这是一种保证行为。
在这行代码下面varclient = QueueClient.CreateFromConnectionString(connectionString," myqueue");
添加client.PrefetchCount = 100;你在任何时候只收到1条消息的原因 第一次打电话是因为当你接受一个会话时也可能 用它获取1条预取消息。然后,当你收到批次, SB客户端会给你1条消息。
不幸的是,我发现设置PrefetchCount
没有影响,但是只收到一条消息的原因似乎很可能,所以我接受了它作为答案。