我们在带有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函数不再被调用。
我们做错了什么,我们该如何解决?
在此先感谢您的帮助!
答案 0 :(得分:1)
如果有人偶然发现了这个问题,那么问题可能是这样的:
由于您正在使用启用了会话的队列,因此,如果要连续使用它们,则写入队列的会话数必须与MaxConcurrentSessions的数目匹配。
否则,MessageWaitTimeout是它将空闲的时间,在超时之后,它将找到一个新的会话ID来使用。
假设您正在使用模数(例如productId%100)来计算写入队列时的会话ID。该示例将生成100个会话。因此,您“必须”将MaxConcurrentSessions设置为100。