2015-02-08 9 views
5

Возможно ли в Akka (scala) получить ссылку на существующую систему ActorSystem?Как получить ссылку на существующую систему ActorSystem в Акке?

Я работаю над применением спрей с другим актером для БД. Я также расширяю Директивы, чтобы иметь объект на каждый путь. директивы сами по себе не являются субъектами, но они должны передавать сообщения DBActor. здесь:

class HttpActor extends Actor with HttpService { 

    val actorRefFactory = context 

    def receive = runRoute(
    IndexService.route ~ 
    HostsService.route  
) 
} 

object HostsService extends Directives{ 
    def route(implicit dm: DetachMagnet2) = { 
    path("hosts") { 
     get { 
     detach() { 
      **dbActor ! CreateHost** 
      complete("get me hosts!") 
     } 
     } ~ 
     post { 
     detach() { 
      entity(as[String]) { payload => 
      complete(s"post hosts $payload")  
      } 
     } 
     } 
    } 
    } 
} 

есть способ для HostsService, чтобы обнаружить сам ActorSystem, чтобы он мог найти DBActor, или должен HttpActor передать его в? последний кажется менее изящным, так как HostsService должен стать классом (а не объектом), поэтому больше не синглтон.

ответ

1

От here:

был билет для создания такого реестра, но мы были не удовлетворены тем, что мы получили при попытке указать семантику в подробно. Одна часть заключается в том, что мы удалили все глобальное состояние, чтобы разные части приложения могли использовать Akka, не беспокоясь о друг другом, и глобальная функция могла бы сломать это. Другим является то, что он будет поощрять использование get-or-create-my pet peeve, что сделает семантику непонятной: вы указываете имя и конфигурацию, но если имя уже существует, вы можете получить обратно настроенную систему (что обычно довольно смертельно).

Там ничто не мешает вам от сдачи в HashMap в каком-то центральном месте вашего приложения, (предварительно) заселить, что с актером системы вам нужно, и быть сделано, это в основном один вкладыш (который является еще одним причина не включать его в Акку, потому что вместо простого решения очень узкой проблемы мы должны думать о решении гораздо более общие проблемы)

в вашем случае, это лучше передайте вашу систему неявно на функцию route:

class HttpActor extends Actor with HttpService { 

    implicit val actorRefFactory = context 

    def receive = runRoute(
    IndexService.route ~ 
    HostsService.route  
) 
} 

object HostsService extends Directives { 
    def route(implicit dm: DetachMagnet2, as: ActorContext) = {...} 
} 
+0

, который сделал это, и достаточно для меня. Теперь мне нужно перейти к следующей проблеме, поэтому все пути, кажется, вызываются при повторном запуске, но когда я вызываю адреса, все, что я получаю, это поток слушателя, говорящий, что он отправляет запрос GET обработчику, который выглядит как системный актер (.../system/IO-TCP/selectors/...), и ничего больше не происходит ... –

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