在以下代码中
即使已将“禁用”消息发送到服务器,也不会记录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)
}
}
答案 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())
// ...
}
}