我有一个source
类型的源Source[ByteString, Any]
和一个sink
类型的宿Sink[ByteString, M]
,其中M
可以是Future[IOResult]
或任何东西。当我运行以下命令时:
source.runWith(sink)
我得到M
作为结果。我没有得到任何其他有用的信息,表明流已成功。如果可以保证是Future[IOResult]
,那会很棒,但是接收器来自通用类型类,您无法在编译时确定类型。
但是,所有类型类的实例都希望报告操作是否成功。
还是应该将物化类型包装为可以轻松操作的自定义类型,例如Result[M]
?这可能需要一个新的类型类,其中M的实例必须是该成员的成员(例如,您应指定Future[IOResult]
如何转换为Result[Future[IOResult]]
。对于M
的所有可能实例相同)。>
答案 0 :(得分:2)
runWith返回具有Sucess或Failure的将来。我们可以使用onComplete回调来提取值。
source.runWith(sink).onComplete {
case Success(value) => logger.info(s"stream completed successfully $value")
case Failure(e) => logger.error(s"stream completed with failure: $e")
}
答案 1 :(得分:1)
您可以在源上使用终止监视程序,和/或在流上使用onComplete
。
source.watchTermination() { (_, done) =>
done.onComplete {
case Success(_) => logger.info("source completed successfully")
case Failure(e) => logger.error(s"source completed with failure : $e")
}
}
.runWith(sink)
.onComplete{
case Success(_) => logger.info(s"stream completed successfully")
case Failure(e) => logger.error(s"stream completed with failure: $e")
}
请参见https://doc.akka.io/docs/akka/current/stream/operators/Source-or-Flow/watchTermination.html
答案 2 :(得分:0)
我设法使其起作用。我要求接收器应具有future作为辅助值:
Sink[ByteString, Future[M]]
这样,返回此类接收器的类型类的任何实例都将被强制将具体化的值包装在Future
中。对于基于文件的IO,这不是问题,因为它已经返回了Future[IOResult]
。