RxJava L'Extraction Des Observables En Parallèle
J'ai besoin d'aide dans la mise en œuvre parallèle des appels asynchrones dans RxJava. J'ai ramassé un cas d'utilisation simple dans lequel le PREMIER appel extrait (plutôt recherches) une liste de produits (Tuiles) à afficher. Les appels suivants de sortir et de chercher de l' (A) des EXAMENS et (B) IMAGES de PRODUITS
Après plusieurs tentatives, j'ai eu à cet endroit.
1 Observable<Tile> searchTile = searchServiceClient.getSearchResults(searchTerm);
2 List<Tile> allTiles = new ArrayList<Tile>();
3 ClientResponse response = new ClientResponse();
4 searchTile.parallel(oTile -> {
5 return oTile.flatMap(t -> {
6 Observable<Reviews> reviews = reviewsServiceClient.getSellerReviews(t.getSellerId());
7 Observable<String> imageUrl = reviewsServiceClient.getProductImage(t.getProductId());
8 return Observable.zip(reviews, imageUrl, (r, u) -> {
9 t.setReviews(r);
10 t.setImageUrl(u);
11 return t;
12 });
13 });
14 }).subscribe(e -> {
15 allTiles.add((Tile) e);
16 });
Ligne 1: sort et va chercher le produit (Carrelage) à afficher
Ligne 4: Nous prenons la liste de l'Observable et l'ÉCLAT de récupérer les commentaires et imageUrls
Mensonge 6,7: Récupérer les Observables de l'examen et Observables url
Ligne 8: Enfin les 2 sont observables zippé jusqu'au retour d'une mise à jour Observables
Ligne 15: enfin la ligne 15 rassemble tous les produits individuels à être affiché dans une collection qui peut être retourné à l'appel de la couche
Tandis que les Observables a été fragmenté et dans nos tests s'exécutent plus de 4 threads différents; aller chercher des commentaires et des images semble être l'un après l'autre. Je soupçonne que le zip étape sur la ligne 8 est essentiellement l'origine de l'ordre d'invocation de la la 2 observables (examens et url).
Ce groupe ont toute proposition à, parallèlement chercher reiews et l'url de l'image. En essence, la chute d'eau tableau joint ci-dessus devrait être empilés à la verticale. Les appels à commentaires et les images doivent être en parallèle
merci
anand raman
- Comment allez-vous générer le Transfert frise chronologique? Il a l'air assez cool et utile. Voudrais l'utiliser moi-même.
- Depuis que mon système était de faire des appels externes j'ai simplement mandaté les appels par le biais de violoneux. Fiddler a une option pour générer réseau des échéanciers. Vous êtes essentiellement en voyant ce point de vue. Après fiddler a été configuré pour l'utilisation de proxy demandes; il vous suffit de sélectionnez les sessions qui vous intéressent, puis cliquez sur l'onglet timeline sur le volet de droite. grâce anand
Vous devez vous connecter pour publier un commentaire.
Le parallèle de l'opérateur s'est avéré être un problème pour presque tous les cas d'utilisation et ne pas faire ce que la plupart d'attendre d'elle, de sorte qu'il a été supprimé dans la version 1.0.0.rc.4 version: https://github.com/ReactiveX/RxJava/pull/1716
Un bon exemple de comment faire ce type de comportement et d'obtenir l'exécution en parallèle peut être vu ici.
Dans votre exemple de code, il est difficile de savoir si
searchServiceClient
est synchrone ou asynchrone. Il affecte la manière de résoudre le problème légèrement comme si elle est déjà asynchrone sans supplément de planification est nécessaire. Si synchrone supplémentaire de planification est nécessaire.Abord voici quelques exemples simples montrant synchrone et asynchrone comportement:
Qui suit est une tentative de fournir un exemple qui correspond le mieux à votre code:
Ce sorties:
J'ai fait chaque IO appel simulé à prendre 1000ms il est donc évident où le temps de latence est et qu'il se passe en parallèle. Il imprime le progrès est fait dans écoulé en millisecondes.
L'astuce ici est que flatMap fusionne les appels asynchrones, donc tant que les Observables d'être fusionnées sont asynchrones, elles seront toutes exécutées simultanément.
Si un appel comme
getProductImage(t.getProductId())
est synchrone, il peut être fait asynchrone comme ceci: getProductImage(t.getProductId()).subscribeOn(Planificateurs.io).Ici est la partie importante de l'exemple ci-dessus, sans la totalité de l'exploitation forestière et passe-partout de types:
J'espère que cette aide.
toBlocking
n'est pas nécessaire pour la synchronisation des appels commemergingSync
etc. Il est seulement nécessaire si nous ne certains appel asynchrone.Des gens qui sont encore @ JDK 7, dont les IDE ne détecte pas automatiquement le JDK 8 de la source de l'instant et de ce que d'essayer le brillant au-dessus de réponse (et explication) par @benjchristensen pouvez utiliser ce sans vergogne refractored, JDK 7, code. Bravo à @benjchristensen pour une incroyable explication et exemple !