Akka关闭TCP演员

时间:2014-02-10 12:56:26

标签: scala tcp akka

在以下代码中

  

GSM模拟未绑定

即使已将“禁用”消息发送到服务器,也不会记录

。如何正确取消绑定akka tcp服务器?

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

  val name = this.getClass().getName()
  val logger = LoggerFactory.getLogger(name)

  def receive = {
    case "enable" => IO(Tcp) ! Bind(self, ConfigurationUtils.gsmRouterAddress)
    case "disable" => IO(Tcp) ! Unbind
    case Unbound =>
      logger.info("GSM mock unbound")
    case Bound(localAddress) =>
      logger.info("GSM mock bound to " + localAddress.getHostName() + ":" + localAddress.getPort())
    case CommandFailed(Bind(_,localAddress: InetSocketAddress, _, _)) =>
      logger.info("Could not bind to " + localAddress.getHostName() + ":" + localAddress.getPort())
      context stop self
    case Connected(remote, local) =>
      logger.info("Client connected to GSM mock")
      val handler = context.actorOf(Props[ConnectionHandler])
      val connection = sender
      connection ! Register(handler)
  }
}

1 个答案:

答案 0 :(得分:2)

向您发送Bound消息的actor实际上也是管理绑定的消息。如果要取消绑定套接字,只需将Unbind发送给该actor即可。只需在actor类中添加socketActor: Option[ActorRef]字段,然后将代码更改为sth即可。像

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

  val name = this.getClass().getName()
  val logger = LoggerFactory.getLogger(name)
  var socketActor: Option[ActorRef] = None

  def receive = {
    // ...
    case "disable" =>
      socketActor.foreach(_ ! Unbind)
    case Bound(localAddress) =>
      socketActor = Some(sender)
      logger.info("GSM mock bound to " + localAddress.getHostName() + ":" + localAddress.getPort())
    // ...
  }
}
相关问题