Акка ждет завершения потока - PullRequest
0 голосов
/ 21 мая 2019

Я хотел бы знать, возможно ли дождаться завершения следующего потока. Это может быть очевидно для некоторых людей, но я новичок в акке.

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 Ответ

1 голос
/ 21 мая 2019

Здесь нужно обратить внимание на две вещи: вы используете Sink (это конец определения потока) и материализованные значения

Sink.actorRef возвращает Sink<In,​NotUsed>, поэтому вы не можете просто узнать информацию о завершении потока из того, что у вас есть (потому что материализованное значение равно NotUsed в вашем случае). Более того, вы не можете использовать другой приемник, который предоставляет эту информацию (например, Sink.ignore, материализованное значение которого дает вам Future о завершении потока), потому что в общем случае поток имеет один приемник (конечно, Вы можете использовать Flow.alsoToMat, но существует лучший подход)

Вы можете использовать Flow.watchTermination в потоке непосредственно перед последним Sink, который сообщит вам о вашем состоянии в восходящем направлении. Вероятно, в этом есть смысл, потому что вы используете Sink.actorRef в форме «отправь и забудь».

Я не знаю вашего полного использования, но на всякий случай, возможно, вы найдете Flow.ask полезным. Он также отправляет сообщение актеру, но также ожидает ответа актера.

...