为什么QueueClient RegisterSessionHandler停止工作?

时间:2018-08-21 06:40:57

标签: c# azure asp.net-core azure-servicebus-queues

我们在带有ASP.NET Core(2.1)的Azure Service Bus(Microsoft.Azure.ServiceBus 3.1.0)中使用会话队列。

我们创建了HostedService(实现IHostedService接口,并将其添加到“启动时的ConfigureService-Method”中的托管服务中)。

在托管服务中,我们具有以下代码:

this.client = new QueueClient(
    this.configuration.ServiceBusConnectionString,
    this.configuration.SessionBasedQueueName,
    ReceiveMode.PeekLock);

this.client.RegisterSessionHandler(
    async (
        session,
        message,
        _) =>
    {
        try
        {
            // handle the message here

            await session.CompleteAsync(
                message
                    .SystemProperties
                    .LockToken);
        }
        finally
        {
            if (!session.IsClosedOrClosing)
            {
                await session.CloseAsync();
            }
        }
    },
    new SessionHandlerOptions(x =>
    {
        // log the exception here

        return Task.CompletedTask;
    })
    {
        AutoComplete = false,
        MaxConcurrentSessions = 1
    });

return Task.CompletedTask;

现在,当代码被执行时,它会工作一段时间,这意味着消息将得到处理。但是经过一段时间(可能需要一个小时,可能只需要两分钟),它突然停止,但队列中仍然有消息。 毫无例外,lambda函数不再被调用。

我们做错了什么,我们该如何解决?

在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

如果有人偶然发现了这个问题,那么问题可能是这样的:

由于您正在使用启用了会话的队列,因此,如果要连续使用它们,则写入队列的会话数必须与MaxConcurrentSessions的数目匹配。

否则,MessageWaitTimeout是它将空闲的时间,在超时之后,它将找到一个新的会话ID来使用。

假设您正在使用模数(例如productId%100)来计算写入队列时的会话ID。该示例将生成100个会话。因此,您“必须”将MaxConcurrentSessions设置为100。