Différence entre L'API RxJava et L'API de flux Java 9

il semble que sur chaque itération de Java pour les dernières versions majeures, il y a toujours de nouvelles façons de gérer les tâches simultanées.

en Java 9, nous avons le API de flux qui ressemble au Flowable API de RxJava mais avec Java 9 a un ensemble beaucoup plus simple de classes et d'interfaces.

Java 9

a un Flow.Publisher,Flow.Subscriber,Flow.Processor, Flow.Subscription et SubmissionPublisher, et c'est il.

RxJava

a entier paquetsAPI de flux - classes similaires, i.e. io.reactivex.flowables,io.reactivex.subscribers,io.reactivex.processors,io.reactivex.observers et io.reactivex.observables qui semblent faire quelque chose de similaire.

Quelles sont les principales différences entre ces deux bibliothèques? Pourquoi quelqu'un utiliserait la bibliothèque Java 9 Flow sur la bibliothèque beaucoup plus diversifiée de RxJava ou vice versa?

45
demandé sur nullpointer 2017-11-17 19:10:06

4 réponses

Quelles sont les principales différences entre ces deux bibliothèques?

L'API Java 9 Flow N'est pas une bibliothèque autonome mais un composant de la bibliothèque Java Standard Edition et se compose de 4 interfaces adoptées à partir de Flux Réactifs spécification établie au début de 2015. En théorie, son inclusion peut permettre des usages spécifiques in-JDK, comme l'incubation de HttpClient, peut-être la connexion async prévue dans certaines parties de la base de données, et bien sûr SubmissionPublisher.

RxJava est une bibliothèque Java qui utilise la conception D'API de style Réactivex pour fournir un riche ensemble d'opérateurs sur les flux de données réactifs (push). Version 2, par Flowable et divers XxxProcessor s, implémente L'API Reactive Streams qui permet les instances de Flowable pour être consommé par d'autres bibliothèques compatibles et à son tour on peut envelopper n'importe quel Publisher dans un Flowable pour les consommer et composer le riche ensemble d'opérateurs avec eux.

donc L'API de flux réactifs est spécification d'interface minimale et RxJava 2 est un mise en oeuvre de celui-ci, plus RxJava déclare un grand ensemble de méthodes supplémentaires pour former une API riche et fluide de ses propres.

RxJava 1 a inspiré, entre autres sources, la spécification Reactive Streams mais n'a pas pu en tirer profit (a dû rester compatible). RxJava 2, étant une réécriture complète et une version principale séparée, pourrait embrasser et utiliser la spécification de flux réactifs (et même développer sur en interne, grâce à l' Src projet) et a été publié presque un an avant Java 9. En outre, il a été décidé que V1 et v2 continuent de supporter Java 6 et donc de nombreuses durées D'exécution Android. Par conséquent, il ne pouvait pas capitaliser directement sur L'API Flow fournie maintenant par Java 9 directement mais seulement par un pont. Un tel pont est requis et/ou fourni par d'autres bibliothèques réactives basées sur des flux.

RxJava 3 mai cible Java 9 API de Flux de mais cela n'a pas encore été décidé et en fonction des fonctionnalités apportées par les versions Java suivantes (c'est-à-dire les types de VALEURs), il se peut que nous n'ayons pas de v3 dans un an environ.

jusque-là, il y a une bibliothèque prototype appelée Reactive4JavaFlow qui implémente L'API de flux et offre une API riche et fluide de style Réactivex.

pourquoi quelqu'un utiliserait la bibliothèque Java 9 Flow au-dessus de la bibliothèque RxJava beaucoup plus diversifiée ou vice versa?

L'API de flux est une spécification d'interopérabilité et non une API d'utilisateur final. Normalement, vous ne l'utiliseriez pas directement mais pour passer des flux autour de diverses implémentations de lui. Lorsque JEP 266 a été discuté, les auteurs n'ont trouvé aucune API de bibliothèque existante assez bonne pour avoir quelque chose par défaut avec L'API Flow (contrairement à la riche java.util.Stream). Par conséquent, il a été décidé que les utilisateurs devront compter sur des implémentations tierces pour l'instant.

Vous devez attendre pour les bibliothèques réactives existantes pour soutenir le flux de manière API, par leur propre mise en œuvre de passerelle ou de nouvelles bibliothèques à mettre en œuvre.

fournir un ensemble riche d'opérateurs sur L'API Flow n'est que la raison pour laquelle une bibliothèque l'implémenterait. Les fournisseurs de sources de données (c.-à-d. les pilotes de base de données réactifs, les bibliothèques réseau) peuvent commencer à mettre en œuvre leurs propres accesseurs de données via L'API de flux et s'en remettre aux bibliothèques riches pour envelopper ceux-ci et fournir la transformation et la coordination pour eux sans forcer tout le monde à mettre en œuvre toutes sortes de ces opérateurs.

par conséquent, une meilleure question Est, devriez-vous commencer à utiliser l'interopération basée sur L'API de flux maintenant ou vous en tenir aux flux réactifs?

si vous avez besoin de solutions efficaces et fiables relativement tôt, je vous suggère de vous en tenir à l'écosystème des cours D'eau réactifs pour l'instant. Si vous avez beaucoup de temps ou si vous voulez explorer des choses, vous pouvez commencer à utiliser L'API Flow.

37
répondu akarnokd 2017-11-17 21:52:18

au début, il y avait Rx, version 1. Il s'agissait d'une spécification agnostique de langage des API réactives qui a des implémentations pour Java, JavaScript, .NET. Puis ils l'ont amélioré et nous avons vu Rx 2. Il a aussi des implémentations pour différentes langues. A L'époque de Rx 2 L'équipe de Spring travaillait sur Réacteur - leur propre jeu d'API réactives.

et puis ils se sont tous dit: Pourquoi ne pas faire un effort commun et créer une API pour les diriger tous. Qui a été comment Réactive Commons a été mis en place. Un effort de recherche conjoint pour construire des opérateurs hautement optimisés et conformes aux flux réactifs. Les responsables actuels comprennent RxJava2 et le réacteur.

en même temps, les développeurs JDK se sont rendu compte que les produits réactifs sont excellents et valent la peine d'être inclus en Java. Comme D'habitude dans le monde de Java, le standard de facto devient de jure. Rappelez-vous Hibernate et JPA, Joda Temps et Java 8 Date/Heure API? Donc, ce que JDK develpers a fait, c'est extraire le noyau APIs réactif, la partie la plus basique, et en faire un standard. C'est de cette façon j.u.c.Flow était né.

Techniquement, j.u.c.Flow est beaucoup plus simple, il se compose seulement de quatre interfaces simples, alors que d'autres bibliothèques fournissent des douzaines de classes et des centaines d'opérateurs.

j'espère que, cela répond à la question "quelle est la différence entre eux".

Pourquoi quelqu'un de choisir j.u.c.Flow plus de Rx? Eh bien, parce que maintenant, c'est un la norme!

actuellement JDK ne dispose que d'une seule implémentation de j.u.c.Flow:API HTTP/2. C'est en fait une API en incubation. Mais à l'avenir, nous pourrions nous attendre à ce Qu'il soit soutenu par le réacteur, RxJava 2, ainsi que par d'autres bibliothèques, telles que les pilotes réactifs DB ou même FS IO.

37
répondu madhead 2017-12-07 09:54:04

"Quelles sont les principales différences entre ces deux bibliothèques?"

comme vous l'avez vous-même noté, la bibliothèque Java 9 est beaucoup plus basique et sert essentiellement d'API générale pour les flux réactifs au lieu d'une solution complète.

" pourquoi quelqu'un utiliserait la bibliothèque Java 9 Flow sur la bibliothèque beaucoup plus diversifiée de RxJava ou vice versa?"

Eh bien, pour la même raison les gens utilisent les constructions de bibliothèque de base sur les bibliothèques - une dépendance de moins à gérer. Également, en raison du fait que L'API de flux en Java 9 est plus générale, elle est moins limitée par l'implémentation spécifique.

8
répondu Piotr Wilkin 2017-11-17 16:21:36

Quelles sont les principales différences entre ces deux bibliothèques?

ceci est surtout vrai en tant que commentaire informatif(mais trop long à intégrer), le JEP 266: More Competiency Updates responsable de l'introduction du Flow API dans Java9 unis dans sa description(l'emphase est mienne) -

  • Interfaces supportant le flux réactifs publier-s'abonner framework, imbriqué dans la nouvelle classe Flux.

  • Publishers produire des articles la consommation par un ou plusieurs Subscribers, chacun géré par un Subscription.

  • la Communication repose sur une forme simple de régulation du débit (méthode Subscription.request, pour communiquer la contre-pression) qui peut être utilisé pour éviter les problèmes de gestion des ressources qui pourraient se produire systèmes basés sur "push". Un classe utilitaire SubmissionPublisher est fourni que les développeurs peuvent utiliser pour créer des composants personnalisés.

  • ceux-ci (très petites interfaces correspondent à celles définies avec une large participation (de L'initiative sur les volets réactifs) et soutenir l'interopérabilité dans un certain nombre de systèmes asynchrones fonctionnant sur des JVM.

  • emboîter les interfaces dans une classe est un politique conservatrice permettant leur utilisation dans diverses possibilités à court et à long terme. Y ne prévoit pas de fournir au réseau d'e/S ou à base de java.util.concurrent les composants pour la distribution de messagerie, mais il est possible que le futur JDK les versions incluront ces API dans d'autres paquets.

pourquoi quelqu'un utiliserait la bibliothèque Java 9 Flow au-dessus de la bibliothèque RxJava beaucoup plus diversifiée ou vice versa?

3
répondu nullpointer 2017-11-17 17:37:02