服务总线会话ReceiveBatchAsync仅接收1条消息

时间:2016-02-03 20:35:10

标签: azure azureservicebus azure-servicebus-queues

我正在使用启用了会话的服务总线队列,并且我发送了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的第一次通话中收到我的所有消息?

1 个答案:

答案 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没有影响,但是只收到一条消息的原因似乎很可能,所以我接受了它作为答案。