Принудительный возврат из RunAsync () через решение, принятое в веб-API Controller в Service Fabric - PullRequest
0 голосов
/ 20 февраля 2019

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

Вопрос относится к конкретному сценарию, когда вы видите вышеупомянутое исключение, находясь в очереди с использованием фиксации StateManager в веб-API.контроллер по http-запросу.

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

  1. Объект Service Fabric удаляется.
  2. Объект Service Fabric недоступен из-за сбоя.

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

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

1 Ответ

0 голосов
/ 20 февраля 2019

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

У вас есть:

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

первое, что нужно здесьпроверить, установлен ли CancellationToken, переданный в RunAsync, когда выброшен FabricObjectCloseException.

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

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

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

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

...