Версия 82.6 (PATCH)

Улучшения и исправления

  • Доработали решение, чтобы избежать появления ошибки (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 — теперь сбой одного хоста логируется, хост остается помеченным недоступным до следующего опроса, а остальная часть цикла восстановления выполняется как обычно