2012-04-16 2 views
0

Akka에서 IOManager는 "IO 수행을위한 소켓을 만드는 데 권장되는 진입 점입니다." API를보고 있는데 읽기 타임 아웃을 설정하는 방법이 궁금합니다. 물론 소켓을 닫기 위해 n 초 안에 메시지를 발사하도록 배우를 일정을 잡을 수는 있지만, 그 시간에 이미 모든 읽기를 받았을 수 있으며 이제 읽기 전용 데이터를 처리하는 중입니다. 따라서 진정한 읽기 타임 아웃이 아닙니다. 어떤 아이디어가 이것을 어떻게? 아니면 어떻게 든 내 배우에게 어떤 상태를 소개해야합니까?IOManager에서 소켓 읽기 제한 시간을 설정하는 방법

답변

1

좋아, 데릭 윌리엄스는 나에게 akka 사용자에게 힌트를 주었다. 다른 사람들이 비슷한 것을 할 필요가있는 경우에 대비하여 코드가 있습니다.

새 클라이언트를 수락 할 때 타이머를 5 초로 설정하여 연결을 닫습니다.

def receive = { 
    case IO.NewClient(server) => 
    val socket = server.accept() 
    val readTimeout = context.system.scheduler.scheduleOnce(5 seconds, self, Timeout(socket)) 
    state(socket) flatMap (_ => MyServer.processRequest(socket, readTimeout)) 

    case IO.Read(socket, bytes) => 
    state(socket)(IO Chunk bytes) 

    case IO.Closed(socket, cause) => 
    state(socket)(IO EOF None) 
    state -= socket 

    case Timeout(socket) => 
    socket.close() 
} 

우리가 읽은 후 시간 초과를 취소하기 위해 Cancellable 일정에 대해 cancel()을 호출합니다.

object MyServer { 
    def processRequest(socket: IO.SocketHandle, readTimeout: Cancellable): IO.Iteratee[Unit] = 
    for { 
     request <- readRequest 
    } yield { 
     readTimeout.cancel() 

     request match { 
      val response = ... 
      socket write ByteString(response).compact 
      socket.close() 
     } 
    } 
} 
관련 문제