Akka流-如何检查流是否成功运行?

时间:2019-06-20 05:20:26

标签: scala akka future akka-stream

我有一个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的所有可能实例相同)。

3 个答案:

答案 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]