【问题标题】:Does is it possible access Http context in actor using Java Akka on Play Framework 2.5是否可以在 Play Framework 2.5 上使用 Java Akka 访问 Actor 中的 Http 上下文
【发布时间】:2017-02-02 16:09:03
【问题描述】:

当 Actor 收到任何消息时,我正在使用 JavaAkka 执行一些任务。当我的演员收到一条消息时,我想从我的一个控制器中执行一些功能,但是在这些功能内部使用 http 上下文:

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)

有什么解决办法吗?

【问题讨论】:

  • 从控制器调用函数的用例是什么?如果你有业务功能,这应该进入其他一些类——看起来没有 http 上下文等,你需要某种特定于用户的属性(会话、语言)。如果您从参与者调用控制器,您会期望哪些值?那会是哪个用户?谁触发了actor消息?它来自控制器,您可以使用询问模式,从而为当前用户“停留”在控制器中。

标签: java playframework playframework-2.0 akka


【解决方案1】:

您的 HTTP 上下文不应超出您的控制器层,否则您会发现自己与不适当的耦合。

另外,你为什么要从一个actor调用控制器上的一个方法?控制器旨在处理传入的 HTTP 请求。这个方法可能不属于控制器吗?

如果您要生成警报,警报会发送到哪里?如果是数据库,则将 DAO 注入到 actor 中。如果它进入一个 HTTP 请求,则将一个 Web 服务客户端或类似的东西注入到 actor 中。

【讨论】:

  • 是的,这可以进入另一个类,但我需要用户消息来进行应用程序国际化。
  • 将消息注入到actor中,并在发送给actor的消息中传递所需的语言。
  • 其实我用 play.il8n.MessagesApi 代替 ctx().messages().at() 解决了这个问题。
  • 完全正确 - 注入消息。搜索Play website,您应该会找到 DI 设置已经知道的组件列表。
  • 播放调度程序有类似的问题。您能否详细说明您是如何注入消息的。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
相关资源
最近更新 更多