2016-08-17 8 views
0

私はTcpクライアントサーバーを作成しています。 サーバーアクターが作成されます。コンストラクタでは、IPとランダムポートにバインドします。Akka Tcpバインドメッセージの使用

私はサーバアクタに通信を開始するための初期メッセージを送信します。 ただし、この最初のメッセージが受信される前に、サーバのアクタはBoundメッセージを受信します。

サーバが最初のメッセージを受信する前にバウンドメッセージを受信する方法はありますか? サーバーのコンストラクタコード

ServerActor extends Actor with ActorLogging 
{ 
    var myAddress:InetSocketAddress = new InetSocketAddress(hostName,0) 
    val options:List[akka.io.Inet.SocketOption] = List():::List(Tcp.SO.ReuseAddress(true)):::List(Tcp.SO.ReceiveBufferSize(65535)) 
     manager ! Bind(self, myAddress,1,options) 

    def receive = { 
     case b @ Bound(addr) => println(addr) 
     myAddress = addr 
     case c @ Connected(remoteAddress,localAddress) => 
      log.info("Client Connected. Remote: {} Local: {}", remoteAddress, localAddress) 
      remoteConnection = sender() 
      remoteConnection ! Register(self) 

     case CommandFailed(_: Bind) => 
      log.error("Binding Command Failed. Exiting.") 
      context stop self  

     case mRegisterMessage: RegisterMessage => 
      { 

       //create register response and send it back 
       val mRegisterResponseMessage = new RegisterResponseMessage(true, "IPv4", myAddress.getHostString, myAddress.getPort) 
       sender() ! RegisterResponseMessage 

      } 
    } 
} 

答えて

0

あなたはすべてのメッセージが隠されるだけBoundメッセージが処理されますpreStart方法を再定義し、まず

context.become({ case b @ Bound(addr) => 
... 
unstashAll() 
context.unbecome()}) 

を行うことができますhttp://doc.akka.io/api/akka/2.4/index.html#akka.actor.Stash

を使用することができます。メッセージが受信されると、標準receiveに切り替わり、すべてのメッセージがハンドラによって受信されます。

関連する問題