2017-02-02 22 views
1

Я использую JavaAkka для выполнения некоторых задач, когда актер получает какое-либо сообщение. Когда мой актер получит сообщение, я хотел бы выполнить некоторые функции от одного из моих контроллеров, однако есть внутри этих функций использует контекст HTTP как:Можно ли получить доступ к контексту Http в акторе с помощью Java Akka на Play Framework 2.5

ctx().messages().at("sensor_alert"); 

или

session().get("id"); 

И я получаю ошибку:

[error] 2017-02-02 13:06:54 -0300 a.a.OneForOneStrategy - There is no HTTP Context available from here. 
java.lang.RuntimeException: There is no HTTP Context available from here. 
    at play.mvc.Http$Context.current(Http.java:62) 
    at play.mvc.Controller.ctx(Controller.java:27) 
    at controllers.IpmiMonitorController.gerarAlertas(IpmiMonitorController.java:370) 
    at actor.IpmiActor.onReceive(IpmiActor.java:27) 
    at akka.actor.UntypedActor$$anonfun$receive$1.applyOrElse(UntypedActor.scala:165) 
    at akka.actor.Actor$class.aroundReceive(Actor.scala:484) 
    at akka.actor.UntypedActor.aroundReceive(UntypedActor.scala:95) 
    at akka.actor.ActorCell.receiveMessage(ActorCell.scala:526) 
    at akka.actor.ActorCell.invoke(ActorCell.scala:495) 
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:257) 

Есть ли решение?

+1

Каков ваш прецедент для вызова функции с контроллера? Если у вас есть бизнес-функции, это должно идти в какой-то другой класс - где нет контекста http и т. Д., Как он выглядит, вам нужны какие-то пользовательские свойства (сеанс, язык). какие значения вы ожидаете, если вы вызываете контроллер у актера? какой пользователь это будет? Кто вызывает сообщение актера? он исходит от контроллера, вы можете использовать шаблон запроса и тем самым «оставаться» в контроллере для текущего пользователя. – rethab

ответ

1

Ваш контекст HTTP должен идти не дальше уровня вашего контроллера, иначе вы окажетесь с несоответствующей связью.

Кроме того, почему вы вызываете метод на контроллере от актера? Контроллеры предназначены для обработки входящих HTTP-запросов. Возможно ли, что этот метод не принадлежит контроллеру?

Если вы создаете оповещения, где будут оповещения? Если это база данных, введите DAO в актера. Если он входит в HTTP-запрос, вставьте клиент веб-службы или подобное в актер.

+0

Да, это может пойти в другой класс, но мне понадобятся сообщения пользователя для интернационализации приложений. – Natanael

+1

Внесите сообщения в актера и передайте требуемый язык в сообщении, которое вы отправляете актеру. –

+0

На самом деле я решил эту проблему, используя play.il8n.MessagesApi вместо ctx(). Messages(). At(). – Natanael