У меня есть служба состояния без поддержки Web Api, которая создает Actor, который выполняет длительную обработку с помощью напоминания (запустить и забыть). Он хранит свой собственный прогресс в местном государстве. Я не могу получить прогресс этого длительного процесса из-за однопоточной природы Actor, любой вызов метода, который получает прогресс, будет ждать, пока длительный процесс не завершится. У кого-нибудь есть решение для этого (без использования внешнего источника данных)?

1
bleeeah 24 Мар 2017 в 14:48

2 ответа

Лучший ответ

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

Хостинг Actors ActorService на самом деле является просто StatelessService (с некоторыми наворотами), и вы можете общаться с ним так же, как и с любым сервисом - добавьте IService к нему и использовать IServiceProxy, чтобы поговорить с ним. Этот SO-ответ показывает, как вы можете это сделать Как получить состояние от субъекта Service Fabric, не дожидаясь завершения других методов?

Если вы хотите добиться прогресса даже во время выполнения вашего метода Actor, вы можете принудительно сохранить изменения состояния в середине вашего длительного выполнения, вызвав

Community 23 Май 2017 в 12:10

Вы можете создать ProgressTrackingActor и периодически обновлять его из существующего Actor. Запросите ProgressTrackingActor для прогресса.

Вы можете использовать ActorReference, чтобы указать, для какого Actor запрашивать ход выполнения, или использовать то же значение ActorId.

1
LoekD 24 Мар 2017 в 12:06