Принудительный возврат из RunAsync() через решение, принятое в веб-API Controller в Service Fabric

Эта тема очень важна для сценария, когда вы видите выброшенное исключение, такое как FabricObjectClosedException,

Вопрос для конкретного сценария, когда вы видите вышеупомянутое исключение в очереди, используя StateManager commit в web api controller по http-запросу.

Чтобы дать больше предыстории, FabricObjectCloseException генерируется, когда объект Service Fabric в данный момент находится в закрытом состоянии по одной из причин ( здесь):

  1. Объект Service Fabric удаляется.
  2. Объект Service Fabric недоступен из-за аварийного переключения.

Если вышеупомянутое исключение было брошено в пределах RunAsync() в то время как цикл, рекомендуемая практика может быть возвращена из RunAsync() метод, который вызывает перезапуск службы на основе ссылки.

Что если исключение было выдано при попытке использовать надежный диспетчер состояний в контроллере веб-API? Как можно RunAsync() из службы с состоянием выйти из цикла while в этом случае?

1 ответ

Решение

Я не уверен на 100%, что понимаю полную картину, но могу представить себе следующие ситуации:

У тебя есть:

  1. Контроллер веб-API, который отображается как ServiceReplicaListener обслуживать входящие запросы
  2. Некоторая справочная информация / продолжается работа, проделанная в RunAsync метод

Первое, что нужно сделать, это проверить, CancellationToken перешел к RunAsync устанавливается когда FabricObjectCloseException брошен

Насколько я понимаю FabricObjectCloseException сбрасывается, когда реплика закрывается ( здесь я однажды описал шаги, которые Service Fabric выполняет, когда служба закрывается) диспетчером кластеров или по некоторым другим причинам. Если это предположение верно, то CancellationToken должен быть установлен.

Если прошло CancellationToken не установлен - тогда я мог бы посоветовать вам:

  1. Создать простой сервис, который упаковывает CancellationTokenSource
  2. Создать экземпляр CancellationTokenSource внутри конструктора StatefulService Класс и инициализировать услугу от #1.
  3. Используя внедрение зависимостей, внедрите этот сервис в контроллер Web API и отмените сигнал, когда FabricObjectCloseException происходит.
  4. В RunAsync, проверьте статус отмены обоих: прошло CancellationToken и таможенное обслуживание.

PS Я не уверен, какую работу вы делаете в RunAsync метод, но я просто хочу отметить, что это нормально, чтобы return от RunAsync когда фоновая часть работы выполнена - или даже не перекрывать ее, когда нет фоновой работы.

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