【发布时间】:2016-05-13 05:56:25
【问题描述】:
我正在使用启用了会话的服务总线队列,并且我正在发送 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 时收到我的所有消息?
【问题讨论】:
标签: azure azureservicebus azure-servicebus-queues