2017-09-19 5 views
2

Fondamentalement, ce que je suis après est de savoir comment créer des ressources 1,2,3,4, traiter les résultats, puis disposer de 4,3,2,1 avec l'exigence que s'il y a une erreur de création de ressource 3, nous avons seulement à disposer de 2,1.RxJava 2 disposer des ressources dans l'ordre inverse

À titre d'exemple, disons que nous avons ceci:

Observable1 lit des lignes à partir d'un fichier et une émission par-t ligne. Pour une gestion correcte de la ressource de fichier, le fichier doit être ouvert au début et fermé à la fin. Observable2 doit accepter les émissions de Observable1 et les écrire dans un autre fichier. Par souci de simplicité, disons qu'il suffit d'ajouter une virgule à la fin de chaque ligne. Pour la gestion correcte d'une autre ressource de fichier, nous devons créer le nouveau fichier au début et vider et le fermer à la fin.

Je suppose que cela devrait ressembler à quelque chose comme

observable1.flatMap (line -> { doMagicHere(line+",") }) 
    .subscribe (line -> { System.out.println(line) }, 
    ex -> { ex.printStackTrace() } 
    ) 

Si une erreur se produit lors de l'ouverture fichier1, nous ne devons pas créer fichier2 (ni la jeter) Si une erreur se produit lors du traitement des lignes, file2 doit être mis au rebut premier et seulement alors, devrait être classé1. (même si dans cet exemple particulier cela fonctionne dans les deux cas)

Je pense que je peux créer Observable1 avec l'opérateur Observable.using(), où nous ouvrons le fichier dans le premier paramètre, créons l'observable dans le second paramètre et, enfin, disposez (fermez) le fichier dans le paramètre 3d.

Je ne sais pas comment appliquer l'opérateur "using" dans la 2ème étape, ou si c'est la bonne façon de procéder.

Merci pour

+0

Utilisez Observable.using() pour effectuer l'allocation et le nettoyage des ressources. (ou fluide, ou simple ... etc) –

Répondre

0

une solution ou des pointeurs (de préférence dans rxjava 2) Vous avez un bon départ avec Observable.using(). Cependant, la première est observable:

Observable<Observable<String>> observable1; 

En ajoutant cette indirection, vous pouvez gérer la situation dans laquelle la première ressource ne se charge pas.

interface FileWriter { 
    void write(String line); 
} 
Observable<FileWriter> makeDestinationFile(String filename); 

En introduisant l'abstraction FileWriter, vous pouvez lier la deuxième ressource.

observable1.flatMap(
    lineSource -> 
     Observable.combineLatest(lineSource, 
     makeDestinationFile(filename), 
     (line, writer) -> writer.write(line + ",")) 
    .subscribe(); 

Lorsque observable1 atteint la fin, les deux seront terminés observables, et les ressources sous-jacentes libérés.

+0

j'ai mal interprété une partie de l'exigence. Je vais bientôt éditer la réponse pour y répondre. –