[OK]を、デレクウィリアムズは私に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()
}
}
}