我想要监视akka-stream的生命周期,似乎monitor会做我需要的,但我的监视功能是异步的,返回Future
,所以我需要监视器同样是异步。
monitor
具有以下签名:
def monitor[Mat2]()(combine: (Mat, FlowMonitor[Out]) ⇒ Mat2): ReprMat[Out, Mat2]
但我需要类似的东西:
def monitorAsync[Mat2]()(combine: (Mat, FlowMonitor[Out]) ⇒ Future[Mat2]): ReprMat[Out, Mat2]
有没有办法使用像mapAsync
这样的akka-streams原语实现这一点。
我想我可以使用mapAsync
+ watchTermination
,但当monitor
几乎完成我需要的工作时,它似乎是一个复杂的解决方案。
答案 0 :(得分:0)
原来monitor
根本不是我想要的,因为只有在实现流后才能访问FlowMonitor
。
我最终使用mapAsync
和recover
实现了此功能。我在这里简化,但是这样的事情:
val monitor = new Monitor {
def onNext: Future[Unit] = ???
def onFailure(cause: Throwable): Future[Unit] = ???
def onFinish: Future[Unit] = ???
}
source.mapAsync { v =>
monitor.onNext.map(_ => v)
}.watchTermination() { (mat, doneF) =>
doneF.flatMap(_ => monitor.onFinish).recoverWith( case ex => monitor.onFailure(ex))
}