Как можно запустить постоянный актер akka с гарантированно полученным первым сообщением?

Мой актер расширяет akka.persistence.PersistentActor. Я хочу сначала отправить класс случая сообщения SetConfig (config: String) и убедиться, что никакое другое сообщение не обрабатывается до того, как SetConfig будет сохранен и применен.

Как лучше всего этого добиться?


person user2728015    schedule 31.03.2015    source источник


Ответы (1)


Я бы использовал Akka FSM вместе с PersistentActor.

У вас может быть два состояния:

sealed trait State
case object Idle extends State
case object Active extends State

и эти данные:

sealed trait Data
case object Uninitialized extends Data
final case class Config(config: String) extends Data

ваш актер продлит FSM[State, Data] и:

startWith(Idle, Uninitialized)

Затем вы можете сказать, что принимаете только SetConfig сообщения, когда Idle:

when(Idle) {
  case Event(SetConfig(conf), Uninitialized) =>
    goto(Active) using Config(conf)
}

и как только вы перейдете на Active, вы сможете получать другие сообщения с помощью:

when(Active) {
  case Event(...

// don't forget to start it up in initial state with:
initialize()

Наконец, при переходах между состояниями вы можете сохранять свое состояние, используя обычные шаблоны сохраняемости Akka.

person yǝsʞǝla    schedule 01.04.2015