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, а затем включите "перерыв при выбросе" в отладчике:
- Показать окно " Настройки исключений" (" Отладка" > " Windows" > " Настройки исключений")
- Выберите категорию исключений Common Language Runtime в списке категорий исключений
- Нажмите зеленую кнопку + (плюс), чтобы добавить новый тип исключения
- Введите System.Fabric.FabricObjectClosedException в текстовое поле и нажмите клавишу ввода
Когда добавляется новый тип исключения, флажок " Прервать выброс" уже установлен.
В следующий раз, когда вы выполните свое приложение в отладчике, отладчик сломается, когда FabricObjectClosedException
брошен, и вы должны быть в состоянии понять, что пошло не так.