Принудительный возврат из RunAsync() через решение, принятое в веб-API Controller в Service Fabric
Эта тема очень важна для сценария, когда вы видите выброшенное исключение, такое как FabricObjectClosedException
,
Вопрос для конкретного сценария, когда вы видите вышеупомянутое исключение в очереди, используя StateManager commit в web api controller по http-запросу.
Чтобы дать больше предыстории, FabricObjectCloseException
генерируется, когда объект Service Fabric в данный момент находится в закрытом состоянии по одной из причин ( здесь):
- Объект Service Fabric удаляется.
- Объект Service Fabric недоступен из-за аварийного переключения.
Если вышеупомянутое исключение было брошено в пределах RunAsync()
в то время как цикл, рекомендуемая практика может быть возвращена из RunAsync()
метод, который вызывает перезапуск службы на основе ссылки.
Что если исключение было выдано при попытке использовать надежный диспетчер состояний в контроллере веб-API? Как можно RunAsync()
из службы с состоянием выйти из цикла while в этом случае?
1 ответ
Я не уверен на 100%, что понимаю полную картину, но могу представить себе следующие ситуации:
У тебя есть:
- Контроллер веб-API, который отображается как
ServiceReplicaListener
обслуживать входящие запросы - Некоторая справочная информация / продолжается работа, проделанная в
RunAsync
метод
Первое, что нужно сделать, это проверить, CancellationToken
перешел к RunAsync
устанавливается когда FabricObjectCloseException
брошен
Насколько я понимаю FabricObjectCloseException
сбрасывается, когда реплика закрывается ( здесь я однажды описал шаги, которые Service Fabric выполняет, когда служба закрывается) диспетчером кластеров или по некоторым другим причинам. Если это предположение верно, то CancellationToken
должен быть установлен.
Если прошло CancellationToken
не установлен - тогда я мог бы посоветовать вам:
- Создать простой сервис, который упаковывает
CancellationTokenSource
- Создать экземпляр
CancellationTokenSource
внутри конструктораStatefulService
Класс и инициализировать услугу от #1. - Используя внедрение зависимостей, внедрите этот сервис в контроллер Web API и отмените сигнал, когда
FabricObjectCloseException
происходит. - В
RunAsync
, проверьте статус отмены обоих: прошлоCancellationToken
и таможенное обслуживание.
PS Я не уверен, какую работу вы делаете в RunAsync
метод, но я просто хочу отметить, что это нормально, чтобы return
от RunAsync
когда фоновая часть работы выполнена - или даже не перекрывать ее, когда нет фоновой работы.