2016-06-12 13 views
1
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を使ってチャットアプリケーションを作ろうとしています。私は公式のドキュメントから上記のコードを使用しました。私はちょうどクライアントからのメッセージが最初に検証され、その後返されるように別のアクター(上記のコードではmainActor)を作成したかったのです。しかし問題はmainActorがmsgを別のクラスのsendMsgに送ることができないことです。私は何が違うの時点で役者を作成しようとする場合にも、それは私に予期しない例外をコンパイルエラーを与える:暫定例外Akka WebSocketで別のアクタを作成できません

+0

'有効ではありません、あなたは追加の引数を渡す必要があり' MYWSACTOR'が故に 'ヴァルMainActorの= actorSystem.actorOf(小道具が[MYWSACTOR]、 "MainActorの")、二つの引数を取り、あなたのコードをよくお読みください。 – liosedhel

+0

私はここで混乱しています...午前は、ちょうど私がここに引数を渡す必要がMYWSACTORクラスの小道具を持つ俳優を作成するので?あなたが私を例として見せてくれれば助かります。 –

+0

ドキュメントを読む:http://doc.akka.io/docs/akka/snapshot/scala/actors.html#Propsあなたの主な俳優は2のparamsを必要とします。しかし、それがヌルでなければ、誰がその主役になるのだろうと思っていますか? (definitelly not)。多分あなたはそれらの俳優のために2つの異なるクラスが必要です。 –

答えて

0

ここでは、あなたはおそらく望んうまくいけば、次のとおりです。

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また、実際のメッセージで、送信することができます(またはデフォルトで、あなたはsender()を呼び出し、送信者ActorRefを取得することができます)、その後、あなたはこのActorRefに再生することができます。

関連する問題