Azure Service Fabric FabricObjectClosedException

У меня есть служба с сохранением состояния, которая хранит вещи в IReliableDictionary. После развертывания в локальном кластере я перезапустил основной узел, чтобы проверить аварийное переключение, однако после этого код StateManager.GetOrAddAsync>("MyDictionary") выбрасывает FabricNotPrimaryException, затем в более поздних испытаниях он генерирует FabricObjectClosedException. Какие вещи я могу проверить, чтобы устранить это?

1 ответ

Основной способ устранения ошибок, подобных этой, состоит в том, чтобы перехватить и записать выбрасываемое исключение:

try
{
    using (var tx = StateManager.CreateTransaction())
    {
        await dictionary.AddOrUpdateAsync(tx, dto.Id, dto, (key, _) => dto);
        await transaction.CommitAsync();
    }
}
catch (FabricObjectClosedException ex)
{
    ServiceEventSource.Current.Message(ex.ToString());
    throw; // Pass the exception up as we only log it here.
}

Тем не менее, ваша проблема может быть очень простой опечаткой, как пропавшая без вести [DataContractAttribute] в классе DTO. В этом случае может быть проще просто отладить проблему, чтобы быстро понять и устранить проблему. Для этого вы должны добавить System.Fabric.FabricObjectClosedException в Visual Studio, а затем включите "перерыв при выбросе" в отладчике:

  1. Показать окно " Настройки исключений" (" Отладка" > " Windows" > " Настройки исключений")
  2. Выберите категорию исключений Common Language Runtime в списке категорий исключений
  3. Нажмите зеленую кнопку + (плюс), чтобы добавить новый тип исключения
  4. Введите System.Fabric.FabricObjectClosedException в текстовое поле и нажмите клавишу ввода

Когда добавляется новый тип исключения, флажок " Прервать выброс" уже установлен.

В следующий раз, когда вы выполните свое приложение в отладчике, отладчик сломается, когда FabricObjectClosedException брошен, и вы должны быть в состоянии понять, что пошло не так.

Другие вопросы по тегам