2017-09-06 1 views
0

J'essaie de créer un flux que je peux consommer via quelque chose comme un Iterator. J'implémente une bibliothèque qui expose une interface de type itérateur, ce qui serait la chose la plus simple à consommer pour moi. Mon graphique conçu jusqu'ici est essentiellement Source<Iterator<DataRow>>. Une chose que je vois jusqu'à présent est d'aplatir à Source<DataRow> puis utiliser http://doc.akka.io/japi/akka/current/akka/stream/javadsl/StreamConverters.html#asJavaStream-- suivie https://docs.oracle.com/javase/8/docs/api/java/util/stream/BaseStream.html#iterator--Comment obtenir un itérateur d'un ruisseau akka Source?

Mais étant donné qu'il y aura beaucoup de lignes potentiellement, je me demande s'il serait judicieux d'éviter l'étape d'aplatissement (à au moins dans le contexte des flux akka, je suppose qu'il y a des frais mineurs par élément lorsqu'ils sont passés via des étapes), ou s'il y a un moyen plus direct.

Aussi, je suis curieux de savoir comment la contre-pression fonctionne dans le flux créé, en particulier l'itérateur enfant; est-ce que cela ne fait que tamponner un élément?

+0

Pourriez-vous élaborer sur * pourquoi * vous * avez * besoin de le transformer en un Iterator? –

+0

J'implémente une API qui expose un curseur sur des lignes de données (essentiellement l'interface de l'itérateur). Soit je vais devoir consommer un itérateur, soit l'implémenter sur un autre. – Bwmat

Répondre

1

Aplatissement Étape

Aplatir un Source<Iterator<DataRow>> à un Source<DataRow> n'ajoute une certaine quantité de frais généraux puisque vous devrez utiliser flatMapConcat qui fait finalement create a new GraphStage. Cependant, si vous avez "plusieurs" lignes alors cette étape séparée peut être utile car elle fournira une simultanéité pour l'étape d'aplatissement.

Backpressure

Si vous regardez at the code de StreamConverters.asJavaStream vous verrez qu'il ya une QueueSink qui fraye un avenir pour tirer l'élément suivant du flux de Akka et faire ensuite un Await.result(nextElementFuture, Inf) attendre sur l'avenir compléter pour que l'élément suivant puisse être transmis au flux java. Répondre à votre question: oui l'enfant Iterator ne fait que tamponner un élément, mais le QueueSink a un avenir qui peut également avoir le DataRow suivant. Par conséquent, l'itérateur javaStream & peut avoir 2 éléments tamponnés, mais en plus, il y a beaucoup de tampons dans votre akka Source.