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