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

Scala 如何在IOManager中设置套接字读取超时,scala,akka,Scala,Akka,在Akka中,IOManager“是创建用于执行IO的套接字的推荐入口点。”我正在查看API,想知道如何设置读取超时?当然,我可以安排一个参与者在n秒内发出一条消息来关闭套接字,但它可能已经在这段时间内收到了所有读取的数据,现在正在处理读取的数据。所以,这不是真正的读取超时。有什么办法吗?还是我必须向我的演员介绍一些状态?好的,德里克·威廉姆斯给了我一个关于akka用户的提示。这是代码,以防其他人需要做类似的事情 当我们接受一个新的客户机时,我们会设置一个5秒钟的计时器来关闭连接 def rec

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

好的,德里克·威廉姆斯给了我一个关于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()
      }
    }
}
对象MyServer{
def processRequest(socket:IO.SocketHandle,readTimeout:cancelable):IO.Iteratee[单位]=
为了{
要求