我使用的是MT 5.5.6 & Azure Service Bus。
我的所有服务偶尔会收到以下异常。
System.InvalidOperationException: Can't create session when the connection is closing.
at Microsoft.Azure.ServiceBus.Core.MessageReceiver.OnReceiveAsync(Int32 maxMessageCount, TimeSpan serverWaitTime)
大多数情况下,一切都按预期工作,但偶尔我也会收到异常。我没有使用ASB的session功能。
我有一个简单的配置,用于从存储库中接收大型消息数据。
x.AddBus(context => Bus.Factory.CreateUsingAzureServiceBus(sbc =>
{
var componentContext = context.Resolve<IComponentContext>();
var host = sbc.Host(new Uri(_appSettings.GetSection("Azure")["ServiceBusUri"]), h =>
{
h.SharedAccessSignature(s =>
{
s.KeyName = _appSettings.GetSection("Azure")["ServiceBusKeyName"];
s.SharedAccessKey = _appSettings.GetSection("Azure")["SharedAccessKey"];
s.TokenTimeToLive = TimeSpan.FromDays(1);
s.TokenScope = TokenScope.Namespace;
});
});
sbc.ReceiveEndpoint(host, _appSettings.GetSection("Azure")["ReceiveQueue"], ep =>
{
ep.PrefetchCount = 16;
ep.Consumer<BatchDocumentPresentedConsumer>(componentContext);
ep.UseMessageData<BatchDocumentReceived>(componentContext.Resolve<IMessageDataRepository>());
});
sbc.UseSerilog();
}));
});
这是来自ASB的队列细节(使用Get-AzServiceBusQueue)。
Name : filter
LockDuration : PT5M
AccessedAt : 11/05/2020 06:24:18
AutoDeleteOnIdle : P427D
CreatedAt : 12/03/2020 06:22:23
DefaultMessageTimeToLive : P366D
DuplicateDetectionHistoryTimeWindow : PT10M
DeadLetteringOnMessageExpiration : True
EnableExpress : False
EnablePartitioning : False
MaxDeliveryCount : 5
MaxSizeInMegabytes : 1024
MessageCount : 0
CountDetails : Microsoft.Azure.Management.ServiceBus.Models.MessageCountDetails
RequiresDuplicateDetection : False
RequiresSession : False
SizeInBytes : 0
Status : Active
UpdatedAt : 12/03/2020 06:22:23
ForwardTo :
ForwardDeadLetteredMessagesTo :
EnableBatchedOperations : True
为什么我会看到这个异常?会不会是因为ASB不可用?
我相信在那个版本的MassTransit中,当应用程序和Azure服务总线之间的连接中断时,存在这样的问题:它会回收连接,然后重新启动所有消费者。然而,当连接表示停止时,消费者并没有正确地退出循环,因此接收器会尝试重新启动,但却失败了。
所以,你的最后一个问题,关于ASB不可用的问题,很可能是连接被中断了,或者AMQP插座因为任何原因被断开了(瞬时故障是会发生的),这是在消费者的重新连接重启过程中抛出的。