2014-12-11 3 views
1

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

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

ответ

1

Настройте одного актера, который выполняет управление этими участниками процесса (скажем, ProcessManager). Этот актер будет поддерживать запросы на получение субъекта процесса для определенного идентификатора процесса. Внутри он увидит, существует ли этот ребенок уже или нет. Если он существует, он ответит на sender с этим номером ref. Если нет, он создаст его, а затем ответит на 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 = { 
    ... 
    } 
} 
0

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

Смежные вопросы