Как инициализировать scala/akka Actor в архитектуре, управляемой событиями?

У меня есть длительные процессы, скажем, от 2 до 1 дня. Каждый процесс начинает свой жизненный цикл с сообщения об обновлении, а затем продолжает прослушивать дальнейшие параллельные обновления. В сообщении об обновлении есть уникальный целевой идентификатор.

Если я хочу представить каждый процесс с актером, как мне инициализировать актера? Мне явно нужно выполнить атомарную операцию поиска / создания на основе значения идентификатора в сообщении об обновлении? Как мне сделать это с помощью scala/akka?

2 ответа

Решение

Настройте одного актера, который выполняет управление этими участниками процесса (скажем, ProcessManager актер). Этот субъект будет поддерживать запросы на получение субъекта процесса для определенного идентификатора процесса. Внутри он увидит, существует ли этот ребенок или нет. Если он существует, он ответит на sender с этим исх. Если нет, он создаст его и затем ответит на sender с этим исх. Поскольку этот актер-менеджер обрабатывает свой почтовый ящик последовательно (как и все актеры), вам не нужно беспокоиться о состоянии гонки с поиском / созданием. Очень упрощенный пример этого:

case class GetProcessHandler(processId:Int)

class ProcessManager extends Actor{

  def receive = {
    case GetProcessHandler(id) =>
      val name = s"proc_$id"
      val handler = context.child(name).getOrElse(
        context.actorOf(Props[ProcessHandler], name)
      )
      sender ! handler
  }
}

class ProcessHandler extends Actor{
  def receive = {
    ...
  }
}

Вы можете указать свои стартовые актеры в вашем application.conf, А потом твой main В программе вы можете создать / инициализировать этих акторов, используя вашу ActorSystem.

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