我正在为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
被过早调用,这导致事务被关闭在过程的中间。