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