2016-08-17 6 views
0

Tcp 클라이언트 서버를 쓰고 있습니다. 서버 액터가 만들어집니다. 생성자에서 IP 및 임의의 포트에 바인딩합니다.Akka Tcp 바운드 메시지 사용량

나는 서버 액터에게 초기 메시지를 보내 통신을 시작합니다. 그러나이 초기 메시지는 서버 액터가 Bound 메시지를 받기 전에 수신됩니다.

서버가 초기 메시지를 받기 전에 Bound 메시지를받는 방법이 있습니까? 당신이 http://doc.akka.io/api/akka/2.4/index.html#akka.actor.Stash

을 사용할 수 있습니다

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

서버 생성자 코드 당신은 preStart 방법을 재정의하고 먼저 모든 메시지가 은닉됩니다 만 Bound 메시지가 처리됩니다

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

을 할 수 있습니다. 그런 다음 메시지가 수신되면 표준 receive으로 전환되며 모든 메시지가 처리기에서 수신됩니다.