如何在IOManager中设置套接字读取超时

时间:2012-04-16 15:22:31

标签: scala akka

在Akka中,IOManager“是创建用于执行IO的套接字的推荐入口点。”我正在看API,并想知道如何设置读取超时?当然,我可以安排一个演员在n秒内触发一个消息来关闭套接字,但它可能已经收到了那个时间的所有读取,现在正在处理读入数据。所以,它并不是真正的读取超时。任何想法如何做到这一点?或者我必须以某种方式向我的演员介绍一些状态吗?

1 个答案:

答案 0 :(得分:1)

好的,Derek Williams给了我一个关于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()
}

要在我们阅读后取消超时,我们会在可取消的时间表上调用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()
      }
    }
}