繁体   English   中英

从 websocket 演员接收时播放演员发送者()返回自身

[英]Play actor sender() return itself when receive from the websocket actor

我正在使用 Play 2.5。 我正在使用 Websocket actor 将消息发送到 Routes Actor。 但是,当在 Routes 上收到 msg 时,sender() 方法返回 Routes 本身而不是该 Websocket actor。

申请如下

@Singleton
class Application @Inject()(implicit val system: ActorSystem,
                            implicit val wsClient: WSClient,
                            implicit val config: Configuration,
                            implicit val materializer: Materializer) extends Controller {
...
  lazy val routesActor = system.actorOf(Props(classOf[RoutesActor]), "routes")

  def ws = WebSocket.accept[JsValue, JsValue] { request =>
    ActorFlow.actorRef(out => UserActor.props(out)(routesActor))
  }

...
}

用户演员:

class UserActor(out: ActorRef)(implicit val RoutesActor: ActorRef) extends Actor with ActorLogging {

  def receive() = {
    case json: JsValue => {
      val parsedQuery = parseQuery(json)
      cachesActor ! (parsedQuery, self)
      log.info("this user is:" + self)
    }
  }

路线演员

class RoutesActor extends Actor with ActorLogging {
  def receive = {
    case (q: ParsedQuery, out: ActorRef) => {
      log.info("Routes:" + self + " get query from : " + sender() + " actually is:" + out)
    }
  }
}

log.info 打印了以下行:

[info] a.RoutesActor - Routes:Actor[akka://application/user/routes#854844162] 查询来自:Actor[akka://application/user/routes#854844162] 实际上是:Actor[akka://应用程序/用户/$b/flowActor#-75193340]

如您所见,sender() 指向自身而不是 flowActor。 因此,我无法使用 sender() 来回复消息。 这让我很困惑。 有没有人有一些想法这里出了什么问题?

tell 的签名是def !(message: Any)(implicit sender: ActorRef): Unit ,所以消息的发送者通过一个隐式参数被接收。 当您从UserActor内部发送消息时,这是定义为类参数的implicit val RoutesActor: ActorRef

如果您想使用UserActor作为发送者,请从参数列表中删除隐式关键字或明确提供self作为发送者: cachesActor.tell((parsedQuery, self), self)

如果您想使用原始发件人,也就是UserActorsender() ,您可以使用forward代替: cachesActor.forward((parsedQuery, self)) 这将显式使用context.sender()而不是隐式RoutesActor作为消息的发送者。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM