좋아, 데릭 윌리엄스는 나에게 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()
}
}
}