0

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

4

1 回答 1

1

好的,Derek Williams 给了我关于 akka-user 的提示。这是代码,以防万一其他人需要做类似的事情。

当我们接受一个新的客户端时,我们设置一个 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()
      }
    }
}
于 2012-04-18T15:36:08.253 回答