Всякий раз, когда я создаю актера, который нуждается в некоторых асинхронно полученных данных, чтобы инициализировать себя, я нахожу себя таким идиомом. У него есть имя? (И это лучший способ сделать это?)Есть ли имя для этой асинхронной идиомы инициализации актера?
class AsyncInitActor(db: Database, someId: UUID) extends Actor with ActorStash {
case class Initialize(something: Something)
override def preStart() = {
db.getSomething(someId) onSuccess { something =>
self ! Initialize(something)
}
}
def receive = {
case Initialize(something) =>
context become initialized(something)
unstashAll()
case _ => stash()
}
def initialized(something): Receive = {
case whatever =>
}
}
В случае субъектов, созданных кластеров сегментирование, асинхронный запрос происходит в receive
вместо preStart
.
Чтобы быть ясным, я не ищу шаблон GoF.
Нет, это не прокси. Актер не перенаправляет запросы другому актеру, он просто задерживает те, которые он обрабатывает, до тех пор, пока не инициализируется. – Derecho
Вы * можете * спроектировать его таким образом, чтобы обертка ожидала инициализации и соответственно переместилась –