2012-04-16 18 views
0

Akkaでは、IOManagerはIOを実行するためのソケットを作成するための推奨エントリポイントです。 APIを見て、読み取りタイムアウトを設定する方法が不思議でしたか?もちろん、ソケットを閉じるためにn秒間にメッセージを送信するように俳優をスケジュールすることはできますが、その時点ですべての読み取りをすでに受け取っている可能性があり、現在は読み取りデータの処理に取り組んでいます。だから、それは本当に読み取りタイムアウトではありません。どのようにこれを行うにはどのようなアイデア?あるいは、どういうわけか私の俳優に何らかの状態を導入しなければならないのですか?IOManagerでソケットの読み取りタイムアウトを設定する方法

答えて

1

[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() 
     } 
    } 
} 
関連する問題