Scala Play actor sender()从websocket参与者接收时返回自身

Scala Play actor sender()从websocket参与者接收时返回自身,scala,playframework,actor,playframework-2.5,Scala,Playframework,Actor,Playframework 2.5,我用的是剧本2.5。我正在使用Websocket参与者将消息发送给参与者。但是,当在Routes上收到msg时,sender()方法返回Routes本身,而不是Websocket参与者 应用程序如下所示 @Singleton class Application @Inject()(implicit val system: ActorSystem, implicit val wsClient: WSClient,

我用的是剧本2.5。我正在使用Websocket参与者将消息发送给参与者。但是,当在Routes上收到msg时,sender()方法返回Routes本身,而不是Websocket参与者

应用程序如下所示

@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打印了以下行:

[信息]a.路由参与者-路由:参与者[akka://application/user/routes#854844162]从:Actor获取查询[akka://application/user/routes#854844162]其实是:演员[akka://application/user/$b/流动演员#-75193340]


如您所见,sender()指向自身,而不是flowActor。因此,我不能使用sender()来回复消息。这使我很困惑。有人知道这里出了什么问题吗?

tell的签名是
def!(message:Any)(隐式发送者:ActorRef):单位
,因此通过隐式参数拾取消息的发送者。当您从
UserActor
内发送消息时,这是定义为类参数的
隐式val RouteSector:ActorRef

如果要将
UserActor
用作发送方,请从参数列表中删除隐式关键字,或显式提供
self
作为发送方:
cachesActor.tell((parsedQuery,self),self)


如果要使用原始发件人,也就是
UserActor
中的
sender()
,则可以改用
forward
cachesActor.forward((parsedQuery,self))
。这将显式使用
context.sender()
而不是隐式的
RoutesActor
作为邮件的发件人。

谢谢!隐式变量愚弄了编译器和我。