我正在使用启用了会话的服务总线队列,并且使用相同的 SessionId 发送 5 条消息。我的接收代码使用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
using:
JobHost host = new JobHost();
host.Start();
var task = host.CallAsync(typeof(Functions).GetMethod("MessageHandlingLoop"));
task.Wait();
host.Stop();
为什么我在第一次通话时没有收到所有消息ReceiveBatchAsync
?
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 https://social.msdn.microsoft.com/Forums/azure/en-US/9a84f319-7bc6-4ff8-b142-4fc1d5f1e2fa/service-bus-session-receivebatchasync-only-receiving-1-message?forum=servbus
服务总线不保证您会收到您指定的消息数
即使您的队列有它们或更多,也要在接收批次中指定。拥有
也就是说,您可以更改代码以尝试获取 100 条消息
第一次打电话,请记住,您的应用程序不应假设
这是一种有保证的行为。
在这行代码下面 varclient =
QueueClient.CreateFromConnectionString(connectionString, "myqueue");
添加 client.PrefetchCount = 100;
您在任何时候都只收到 1 条消息的原因
第一次通话是因为当您接受会话时,它也可能是
获取 1 条预取消息。然后当你收到批次时,
SB 客户端会给您 1 条消息。
不幸的是我发现设置PrefetchCount
没有影响,但只收到一条消息的原因似乎很可能,所以我接受它作为答案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)