簡體   English   中英

無法在Akka WebSocket中創建另一個actor

[英]unable to create another actor in Akka WebSocket

class HomeController  @Inject (implicit actorSystem:ActorSystem, materializer :Materializer) extends Controller 
{ 

    case class sendMsg(msg:JsValue)
    class MYWSACTOR(out:ActorRef,mainActor:ActorRef) extends Actor 
    {

        def receive = 
        {

            case msg : JsValue =>
            mainActor ! sendMsg(msg)

            case sendMsg(msg) => 
            {
                /* validation part */
                out ! msg
            }
        }

    }

}

val mainActor = actorSystem.actorOf(Props[MYWSACTOR],"mainActor")

def object MYWSACTOR 
{
    def props(out:ActorRef) = Props(new MYWSACTOR(out,mainActor))
}

def socket = WebSocket.accept[JsValue,JsValue] 
{ 
    request =>

    ActorFlow.actorRef(out => MYWSACTOR.props(out))

}

我是Akka和Scala的新手。 我正在嘗試使用Scala和Play框架2.5.3中的Akka進行聊天應用程序。我使用了官方文檔中的上述代碼。 我只想創建另一個actor(上面代碼中的mainActor),以便首先驗證來自客戶端的消息然后再發送回來。 但問題是mainActor無法將msg發送到另一個類sendMsg。 此外,如果我嘗試在任何不同的點創建actor,它會給我編譯錯誤意外異常:臨時異常

希望你有可能想要的是:

case class SendMsg(msg: JsValue)
case class ReceivedMessage(wsActor: ActorRef, msg: JsValue)

class MyWsActor(out: ActorRef, mainActor:ActorRef) extends Actor {

  def receive = {
    case msg : JsValue =>
      mainActor ! ReceivedMessage(self, msg)

    case SendMsg(msg) =>
      out ! msg
  }
}

object MyWsActor {
  def props(out: ActorRef, mainActor: ActorRef) = Props(new MyWsActor(out, mainActor))
  //or if you want to instantiate your Props with reflection
  def props2(out: ActorRef, mainActor: ActorRef) = Props(classOf[MyWsActor], out, mainActor)
}

class MainActor() extends Actor {
  def receive = {
    case ReceivedMessage(wsActor, msg) => {
      /*
      Do sth with msg
       */
      val result = msg
      wsActor ! SendMsg(result) //here sender is your MyWsActor
    }
  }
}

class HomeController  @Inject() (
    actorSystem: ActorSystem,
    materializer: Materializer
) extends Controller {

  val mainActor = actorSystem.actorOf(Props[MainActor], "mainActor")

  def socket = WebSocket.accept[JsValue,JsValue] {
      request =>
        ActorFlow.actorRef(out => MyWsActor.props(out, mainActor))
  }

}

關鍵是您可以使用實際消息發送ActorRef (或者默認情況下您可以使用發送方ActorRef調用sender() )然后您可以重播此ActorRef。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM