【问题标题】:Service Bus Session ReceiveBatchAsync only receiving 1 message服务总线会话 ReceiveBatchAsync 仅接收 1 条消息
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多