Scala 如何关闭Akka流Tcp服务器中的连接?

Scala 如何关闭Akka流Tcp服务器中的连接?,scala,akka,akka-stream,Scala,Akka,Akka Stream,close()在基于akka streams的Tcp服务器中的预期行为是,客户端应立即看到SocketException,并且在异常之后发布的任何消息都不应传递到服务器。但是,必须传递在异常之前发送的最后一条消息。所有新客户端都应该遇到ConnectException 无法解读关于“关闭连接”的段落,我们正在对Tcp服务器使用一个实现close(),如下所示: val serverSource: Promise[ByteString] = Promise[ByteString]() v

close()在基于akka streams的Tcp服务器中的预期行为是,客户端应立即看到SocketException,并且在异常之后发布的任何消息都不应传递到服务器。但是,必须传递在异常之前发送的最后一条消息。所有新客户端都应该遇到ConnectException

无法解读关于“关闭连接”的段落,我们正在对Tcp服务器使用一个实现close(),如下所示:

  val serverSource: Promise[ByteString] = Promise[ByteString]()

  var serverBindingOption: Option[Tcp.ServerBinding] = None

  def bind(address: String, port: Int, target: ActorRef, maxInFlight: Int)
    (implicit system: ActorSystem, actorMaterializer: ActorMaterializer): Future[SyslogStreamServer] = {
    implicit val executionContext = system.dispatcher
    val sink = Sink.foreach {
      conn: Tcp.IncomingConnection =>
        val targetSubscriber = ActorSubscriber[Message](system.actorOf(Props(new TargetSubscriber(target, maxInFlight))))

        val targetSink = Flow[ByteString]
          .via(Framing.delimiter(ByteString("\n"), maximumFrameLength = MaxFrameLength, allowTruncation = true))
          .map(raw ⇒ Message(raw))
          .to(Sink(targetSubscriber))

        conn.flow.to(targetSink).runWith(Source(serverSource.future).drop(1)) // drop the last one for no response
    }

    for {
      serverBinding ← Tcp().bind(address, port).to(sink).run()
    } yield {
      serverBindingOption = Some(serverBinding)
      new SyslogStreamServer
    }
  }

  def close()(implicit ec: ExecutionContext): Future[Unit] = {
    serverSource.success(ByteString.empty) // dummy value to be dropped above
    serverBindingOption match {
      case Some(serverBinding) ⇒ serverBinding.unbind()
      case None ⇒ Future[Unit] {}
    }
  }
这是关闭服务器的好方法吗?(用于部署等)

如果有人可以对上述close()实现的有效性进行审查和评论。我们试图证明或反驳自己,这段代码是否满足所有要求,并想知道我们是否应该首先成功地实现流的源代码,还是首先解除服务器绑定?任何评论/批评都将不胜感激。提前谢谢