Akka / Scala是否检测到已关闭的TCP连接?

Reb*_*cca 5 scala akka

我正在尝试使用Akka和Scala编写一个TCP服务器,这将在客户端分别连接和断开连接时实例化actor并停止actor。我有一个TCP绑定演员,

 class Server extends Actor{
   import Tcp._
   import context.system

   IO(Tcp) ! Bind(self, new InetSocketAddress("localhost", 9595))

   def receive = {

     case Bound(localAddress) =>
       println("Server Bound")
       println(localAddress)

     case CommandFailed(_: Bind) => context stop self

     case Connected(remote, local)=>
       val handler = context.system.actorOf(Props[ConnHandler])
       val connection = sender()
       connection ! Register(handler)
   }
 }
Run Code Online (Sandbox Code Playgroud)

上面实例化了一个TCP侦听器,localhost:9595并为每个连接注册了处理程序参与者。

然后receive,我在ConnHandler类中定义了def,将其缩写...为代码正确运行的位置。

case received => {...}
case PeerClosed => {
    println("Stopping")
    //Other actor stopping, cleanup.
    context stop self
}
Run Code Online (Sandbox Code Playgroud)

(有关我以前编写此文档的信息,请参见http://doc.akka.io/docs/akka/snapshot/scala/io-tcp.html-在这种PeerClosed情况下,它使用或多或少的相同代码)

但是,当我关闭套接字客户端时,actor仍在运行,并且没有“停止”消息被打印。

我附近没有配置非Windows机器来进行测试,因为我认为这与我在Windows上运行有关,因为在四处搜寻之后,我发现了一个仍未解决的错误-https: //github.com/akka/akka/issues / 17122-表示在基于Windows的系统上缺少一些关闭事件。

我在代码中犯了一个愚蠢的错误,还是这是上面链接的错误的一部分?

尽管我可以写一个Received(data)关闭连接的案例,但是,由于网络断开或某些原因而导致的断开连接会使服务器处于不可恢复的状态,因此需要重新启动应用程序,因为它将使辅助共享角色位于状态表明客户端仍处于连接状态,因此服务器将拒绝该用户的进一步连接。

编辑:

我通过添加一个看门狗定时器actor来解决此问题,该定时器actor具有周期性的动作,该动作会在一段时间后触发。该ConnHandler演员将每一个事件发生在连接上一次复位看门狗定时器。尽管不理想,但它确实可以实现我想要的功能。

win*_*nry -1

编辑 12/9/2016:即使客户端意外断开连接,ConnHandler 也会收到 PeerClosed 消息。