Akka等待流完成

时间:2019-05-20 22:25:02

标签: java akka akka-stream

我想知道是否可以等待以下流的完成。对于某些人来说这可能很明显,但是我是akka的新手。

final Materializer mat = ActorMaterializer.create(getContext());

String path = "Databases\\" + r.book.db + "\\" + r.book.title + ".txt";
Stream<String> fileStream = Files.lines(Paths.get(path));

Source<StreamResult, NotUsed> lines = Source.from(fileStream
                            .map(e -> new StreamResult(r.replyTo, e))
                            .collect(Collectors.toList()));

lines.throttle(1, Duration.ofSeconds(1))
                            .runWith(Sink.actorRef(sender, new StreamEnd()), mat);

1 个答案:

答案 0 :(得分:1)

在这里需要注意的两件事是,您使用Sink(即流定义的结尾)和materialised values

Sink.actorRef返回Sink<In,​NotUsed>,所以您不能仅仅从已有内容中找出流终止信息(因为您的实例化实现值为NotUsed)。此外,您不能使用其他提供此信息的接收器(例如Sink.ignore,其物化值为您提供Future有关流何时结束的信息),因为通常流中只有一个接收器(当然,您可以使用Flow.alsoToMat,但存在更好的方法)

您可以在最后一个Sink之前的流中使用Flow.watchTermination,这将告诉您您的上游状态。也许这是最有意义的,因为您以“发送并忘记”的形式使用Sink.actorRef

我不知道您的完整用例,但以防万一,您可能会发现Flow.ask有用。它也向演员发送消息,但也等待演员响应。