Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 无法在Akka WebSocket中创建其他参与者_Scala_Playframework_Websocket_Akka - Fatal编程技术网

Scala 无法在Akka WebSocket中创建其他参与者

Scala 无法在Akka WebSocket中创建其他参与者,scala,playframework,websocket,akka,Scala,Playframework,Websocket,Akka,我是阿克卡和斯卡拉的新手。我正在尝试使用Scala和Play framework 2.5.3中的Akka制作一个聊天应用程序。我使用了官方文档中的上述代码。我只是想创建另一个actor(上面代码中的maincactor),以便首先验证来自客户端的消息,然后将其发送回。但问题是mainActor无法将消息发送到另一个类case sendMsg。另外,如果我尝试在任何不同点创建参与者,它会给我编译错误意外异常:临时异常 class HomeController @Inject (implicit

我是阿克卡和斯卡拉的新手。我正在尝试使用Scala和Play framework 2.5.3中的Akka制作一个聊天应用程序。我使用了官方文档中的上述代码。我只是想创建另一个actor(上面代码中的maincactor),以便首先验证来自客户端的消息,然后将其发送回。但问题是mainActor无法将消息发送到另一个类case sendMsg。另外,如果我尝试在任何不同点创建参与者,它会给我编译错误意外异常:临时异常

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))

}

关键是,您可以使用实际消息发送
ActorRef
(或者默认情况下,您可以让发送者
ActorRef
调用
sender()
),然后您可以重播到该ActorRef。

希望您能做到:

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))

}

关键是,您可以使用实际消息发送
ActorRef
(或者默认情况下,您可以获得一个发送者
ActorRef
调用
sender()
),然后您可以重播到此ActorRef。

仔细阅读您的代码,
MYWSACTOR
接受两个参数,因此
val maincactor=actorSystem.actorOf(Props[MYWSACTOR],“mainActor”)
无效,您需要传递额外的参数。我在这里感到困惑…因为我刚刚创建的actor具有MYWSACTOR类的道具,我需要在这里传递参数吗?如果你能给我举个例子会很有帮助。阅读文档:你的主要演员需要两个参数。但我想知道谁将是它的主角,它应该是空的吗?(当然不是)。也许你需要为这些演员设置两个不同的类。我尝试了为mainActor设置不同的类,但当我想从MYWSACTOR传递这些类时,它不起作用。实际上,我无法为任何工作将控件从out actor传递到mainActor。请仔细阅读您的代码,
MYWSACTOR
接受两个参数,因此
val mainActor=actorSystem.actorOf(Props[MYWSACTOR],“mainActor”)
无效,你需要传递额外的参数。我在这里很困惑…因为我刚刚创建的演员有MYWSACTOR类的道具,我需要在这里传递参数吗?如果你能给我举个例子会很有帮助。阅读文档:你的主要演员需要两个参数。但我想知道谁将是它的主角,它应该是空的吗?(当然不是)。也许你需要为这些演员设置两个不同的类。我尝试了为mainActor设置不同的类,但当我想从MYWSACTOR传递这些类时,它不起作用。实际上,对于任何工作,我都无法将控件从out actor传递到Main actor。