在尝试在天蓝色服务总线中发送到队列时捕获并重试瞬时异常时,与在测试场景中发送超过25,000条消息时相比,我看到的消息数量更多。我希望,如果我确实有多余的消息,那么它们将是第一次实际到达消息总线的某种超时/重试的结果。
我们正在使用.Net Standard Micrososft.Azure.ServiceBus库版本3.0.2
无限循环中的基本逻辑:
其他说明-在调试中,我看到许多“ system.timeout”异常,但是在未在调试中运行时无法捕获它们。
public async Task SendToAzureQueue(Message messageToSend) {
while (true) {
try {
await messageSender.SendAsync(messageToSend);
break;
}
catch (Exception ex) when (
ex is ServerBusyException ||
ex is ServiceBusCommunicationException ||
ex is ServiceBusTimeoutException ||
ex is SessionCannotBeLockedException ||
ex is SocketException
) {
_logger.Warn($"Transient Exception Thrown. MessageId: {messageToSend.MessageId} - Retrying in 1-10 seconds.\n", ex);
var randomGenerator = new Random();
await Task.Delay(randomGenerator.Next(1000, 10000));
}
}
}
调用函数使用try / catch(例外)包装
这是集成测试的代码,调用上面的代码:
var graphLogObjects = AutoFixture.CreateMany<GraphlogWithNumericId>(30000);
var tasks = graphLogObjects
.Select(graphLogEntryDto => _jsonSerializer.Serialize(graphLogEntryDto))
.Select(dataToSend => graphLogMessageQueue.SendToAzureQueue(Message messageToSend));
await Task.WhenAll(tasks);