Как мне контролировать исполнение актерской системы в Akka во время выполнения?
Я пытался найти способ управления передачей сообщений во время выполнения в системе акторов с помощью какого-либо внешнего (отдельного от системы акторов) контроллера. Другими словами, с учетом действующей системы (которую я не хочу менять): как мне установить своего рода контроллер, который контролирует передачу сообщений внутри нее?
Например, представьте, что данная система акторов имеет следующую настройку:
object Program extends App {
val system = ActorSystem("system")
val B = system.actorOf(Props[B], "B")
val A = system.actorOf(Props(new A(B)), "A")
A ! "Start"
system.terminate()
}
class A(B: ActorRef) extends Actor {
def receive = {case "Start" => B ! "Message"}
}
class B extends Actor {
def receive = {case "Message" => println("Some logic")}
}
Я хочу сделать следующее:
- Запустите эту программу синхронно, в одном потоке
- Для каждого сообщения, передаваемого в системе: проверьте содержимое, отправителя и получателя и на основании этого; выполнить некоторую логику.
В приведенном выше примере я хотел бы "контроллер", который будет делать что-то вроде:
- Актер А получил сообщение "Старт" извне и отправил "Сообщение" Актеру Б
- Выполните некоторую блокирующую логику на контроллере, то есть система актора будет бездействовать, ожидая выполнения этой логики.
- Теперь, когда логика была выполнена, контроллер посылает зеленый свет системе актера, чтобы возобновить передачу сообщения.
- Актер Б получает "Сообщение" и печатает "Некоторая логика"
- Контроллер проверяет, завершена ли система субъекта, какой она является, и выполняет некоторую дополнительную логику.
Короче говоря, я хочу, чтобы внешний контроллер мог контролировать передачу сообщений в системе акторов во время выполнения.
Я думал, что этот контроллер может быть реализован с использованием диспетчера, логики актера маршрутизатора и фьючерсов. Я не нашел примеров в документации Akka по этому поводу, так возможно ли это сделать?