Если у вас есть несколько ответов, ask
не будет сокращать его, то есть только для одного запроса-ответа, где ответ заканчивается Future
/ CompletionStage
.
. Несколько разных стратегий для ожидания всех ответов:
Одна из них - создать промежуточного субъекта, единственной задачей которого является сбор всех ответов, а затем, когда все частичные ответы получены, отвечают исходному запрашивающему, таким образом, вы можете использовать ask чтобы вернуть один агрегированный ответ.
Другой вариант - использовать Source.actorRef
, чтобы получить ActorRef
, который можно использовать как sender
вместе с tell
(и пропустить с помощью ask
) , Внутри потока вы должны брать элементы до тех пор, пока не будут выполнены некоторые критерии (прошло время или элементы были замечены) Возможно, вам придется добавить оператор в mimi c тайм-аут ответа на запрос, чтобы убедиться, что поток не работает, если субъект никогда не отвечает.
Есть некоторые другие проблемы с общим кодом, один из которых создает материализатор на каждый запрос имеет жизненный цикл и будет заполнять вашу кучу с течением времени, вам лучше вводить материализатор из игры.
С данным логом c нет необходимости использовать GraphDSL, что необходим только для сложных потоков с несколькими входами и выходами или циклами. Вы должны иметь возможность составлять операторы, используя только API потока (см., Например, https://doc.akka.io/docs/akka/current/stream/stream-flows-and-basics.html#defining -and-running-streams )