Akka流(Akka Http)-在使用所有elementa之前调用watchTermination

时间:2019-04-07 22:12:08

标签: akka-stream akka-http

我正在为neo4j(https://github.com/neotypes/neotypes)开发一个异步scala驱动程序,并尝试为Akka Stream实现查询结果流。

Akka Stream的类型类如下:

  type Stream[T] = Source[T, Future[Unit]]

  def init[T](value: () => Future[Option[T]]): AkkaStream.Stream[T] =
    Source
      .repeat()
      .mapAsync[Option[T]](1)(_ => value())
      .takeWhile(_.isDefined)
      .map(_.get)
      .viaMat(Flow[T])((_, _) => Future.successful(()))

我还有以下完成挂钩:

  override def onComplete[T](s: AkkaStream.Stream[T])(f: => Future[Unit]): AkkaStream.Stream[T] =
    s.watchTermination() {
      (_, done) =>
        done.flatMap(_ => f)
    }

完成挂钩的主要目的是在读取所有元素之后正常关闭事务。上面的代码与简单的Sink(工作示例https://github.com/neotypes/neotypes/blob/master/akka-stream/src/test/scala/neotypes/akkastreams/AkkaStreamSpec.scala)一起使用时可以按预期工作,但是,当我尝试通过Akka Http流式传输结果时,watchTermination被过早调用,这导致事务被关闭在过程的中间。

0 个答案:

没有答案