我想知道是否可以等待以下流的完成。对于某些人来说这可能很明显,但是我是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);
答案 0 :(得分:1)
在这里需要注意的两件事是,您使用Sink
(即流定义的结尾)和materialised values
Sink.actorRef
返回Sink<In,NotUsed>
,所以您不能仅仅从已有内容中找出流终止信息(因为您的实例化实现值为NotUsed
)。此外,您不能使用其他提供此信息的接收器(例如Sink.ignore
,其物化值为您提供Future
有关流何时结束的信息),因为通常流中只有一个接收器(当然,您可以使用Flow.alsoToMat
,但存在更好的方法)
您可以在最后一个Sink
之前的流中使用Flow.watchTermination
,这将告诉您您的上游状态。也许这是最有意义的,因为您以“发送并忘记”的形式使用Sink.actorRef
。
我不知道您的完整用例,但以防万一,您可能会发现Flow.ask
有用。它也向演员发送消息,但也等待演员响应。