Я не понимаю, как передать сообщение актору, у которого есть конструктор, принимающий в качестве аргументаactorRef.
Я пытаюсь реализовать простой сервер веб-сокетов с помощью Play Framework.
Я получаю клиентский запрос в контроллере, и я могу передать запрос родительскому актеру (который принимает actRef в качестве аргумента конструктора), который, в свою очередь, передает запрос дочернему актеру.
Как только дочерний актер обработал запрос, я не могу отправить ответ контроллеру.
@Singleton
class RequestController @Inject()(cc: ControllerComponents)(implicit system: ActorSystem, mat: Materializer) extends AbstractController(cc) {
def ws = WebSocket.accept[String, String] {req =>
ActorFlow.actorRef { out =>
ParentActor.props(out)
}
}
}
=======
object ParentActor {
def props(out: ActorRef) = Props(new ParentActor(out))
}
class ParentActor(out : ActorRef) extends Actor {
implicit val actorSystem = ActorSystem("ab")
override def receive: Receive = {
case msg: String =>
val childActor: ActorRef = actorSystem.actorOf(Props[ChildActor])
childActor ! msg
case msg: Response => out ! msg
}
}
==================
case class Response(name:String, msg:String)
class ChildActor extends Actor{
implicit val actorSystem = ActorSystem("cd")
override def receive: Receive = {
case msg : String =>
// Below statement is not working. I tried with sender() instead of self
// which is also not working
val parentActor = actorSystem.actorOf(Props(new ParentActor(self)))
parentActor ! Response("ABC",msg)
}
}


Прямо сейчас вы создаете нового актера с линией
val parentActor = actorSystem.actorOf(Props(new ParentActor(self)))
Если вы уверены, что сообщение всегда исходит от соответствующего ParentActor, вам не нужно создавать нового актера, и вы должны иметь возможность отправить ему сообщение с помощью
sender() ! Response("ABC", message)
Спасибо. Позвольте мне попробовать ваше предложение и ответить