У меня есть SourceQueue
. Когда я предлагаю элемент для этого, я хочу, чтобы он прошел через Stream
, и когда он достигнет Sink
, результат возвращается к коду, который предложил этот элемент (аналогично Sink.head
возвращает элемент вызова RunnableGraph.run()
).Akka Stream возвращать объект из раковины
Как это достичь? Простой пример моей проблемы было бы:
val source = Source.queue[String](100, OverflowStrategy.fail)
val flow = Flow[String].map(element => s"Modified $element")
val sink = Sink.ReturnTheStringSomehow
val graph = source.via(flow).to(sink).run()
val x = graph.offer("foo")
println(x) // Output should be "Modified foo"
val y = graph.offer("bar")
println(y) // Output should be "Modified bar"
val z = graph.offer("baz")
println(z) // Output should be "Modified baz"
Edit: Для примера я дал в этом вопросе Владимир Матвеев предоставившего лучший ответ. Однако следует отметить, что это решение работает только в том случае, если элементы входят в sink
в том же порядке, в каком они были предложены для source
. Если это не может быть гарантировано, порядок элементов в sink
может отличаться, и результат может отличаться от ожидаемого.
Это классно, и он отлично работает с моим примером. Однако в моем фактическом коде я использую 'Stream' для обработки' HttpRequests'. «Поток» развивает несколько подпотоков и снова сливается. Некоторые из подпотоков будут быстрее, чем другие, и использование 'Sink' как' queue' заставляет меня думать, что я не могу гарантировать, что запросы будут в конечном итоге с правильным ответом. – RemcoW
Ну, в соответствии с вашими примерами и описанием, вы хотите нажать значение в исходную очередь, а затем вывести его из раковины синхронно. До тех пор, пока вы будете следовать шаблону «нажимать на вход - вытащить результат», вы можете быть уверены, что обрабатываете ответы в правильном порядке. Но даже если ваш шаблон доступа отличается (и было бы хорошо, если бы оно было отражено в вопросе), самый простой способ сопоставить запрос с ответом - передать запрос вместе с преобразованным значением в кортеже. –
Вы правы, я не упоминал об этом в своем описании. Ответ - лучший ответ на этот вопрос. – RemcoW