Доработали решение, чтобы избежать появления ошибки (Pravo.Tech NOT_FOUND - no queue CrudScriptFileHandle), периодически возникающей при попытке авторизации.
Выявили причины зависания очередей RabbitMQ на SaaS П(Д) и реализовали ряд доработок:
Чтобы избежать избыточного сброса соединения при штатном закрытии канала, в Worker.cs заменили вызов InvalidateIncomingConnection() на RestoreBrokenIncomingConnection(), который перед уничтожением проверяет реальное состояние соединения (Connection.IsOpen) и сбрасывает его, только если оно действительно закрыто
Для исключения чтения и изменения поля _channelEntry без синхронизации одновременно из двух потоков:
В Worker.cs добавили поле _channelLock
Все точки доступа к _channelEntry (Start, Restart, CloseChannel, IsRestoreRequired, SafeAck, SafeNack) обернули в lock
В CloseChannel() добавили try/catch вокруг Dispose() канала, чтобы исключение при закрытии не прерывало очистку состояния
Чтобы избежать уничтожения всего соединения при неудачной попытке открытия одного нового канала, в ChannelPool.cs добавили проверку connectionPool.Connection.IsOpen — теперь соединение уничтожается, только если оно действительно закрыто (при открытом соединении неудачная попытка просто повторяется на следующей итерации retry-цикла)
Чтобы сбой одного хоста не прерывал весь цикл восстановления, в MessageBusReceiver.cs вызов StartReceiveMessages(host.Key) обернули в try/catch — теперь сбой одного хоста логируется, хост остается помеченным недоступным до следующего опроса, а остальная часть цикла восстановления выполняется как обычно