У меня есть актер, который создает еще один:Инициализация актера, прежде чем быть в состоянии справиться с некоторыми другими сообщениями
class MyActor1 extends Actor {
val a2 = system actorOf Props(new MyActor(123))
}
Второй актер должен инициализировать (начальная загрузка) сам когда он создал, и только после этого он должен быть в состоянии выполнять другую работу.
class MyActor2(a: Int) extends Actor {
//initialized (bootstrapped) itself, potentially a long operation
//how?
val initValue = // get from a server
//handle incoming messages
def receive = {
case "job1" => // do some job but after it's initialized (bootstrapped) itself
}
}
Так что самое первое, что MyActor2
нужно сделать, это сделать какую-то работу инициализации себя. Это может занять некоторое время, потому что это запрос на сервер. Только после успешного завершения он должен иметь возможность обрабатывать входящие сообщения через receive
. До этого - он не должен этого делать.
Конечно, запрос на сервер должен быть асинхронными (предпочтительно, с использованием Future
, а не async
, await
или другой материал на высоком уровне, как AsyncHttpClient
). Я знаю, как использовать будущее, но это не проблема.
Как это обеспечить?
p.s. Я предполагаю, что он должен отправить сообщение самому себе.
Sorry , Я забыл упомянуть, что мне нужно инициализировать 'val initValue =' с результатом инициализации. Таким образом, в конечном итоге 'initValue' должен содержать результат процесса инициализации. Каков наилучший способ сделать это? –
@Alex: см. Обновление. Вы можете изменять поведение без 'var' много раз - см. [Этот ответ] (http://stackoverflow.com/a/17208523/406435). – senia
И если я хочу использовать 'var', тогда он будет иметь значение по умолчанию (null), а затем будет определено? –