BackDay Xebia : Découvrez RxJava, le reactive programming

Post on 27-Jul-2015

142 views 4 download

Transcript of BackDay Xebia : Découvrez RxJava, le reactive programming

Jérome Doucet | Romain Niveau

RxJava

Découvrez RxJava, le reactive programming

Pourquoi Rx ?

OriginePourquoi Rx

• Reactive programming

• Rx: Reactive Extensions

• Initialement en .NET

• Polyglote

• Extension du pattern Observer

3

DocumentationsPourquoi Rx

• Documentations très riches

• Basées sur des diagrammes à billes

• Arbre de décision pour trouver les bons opérateurs

4

DocumentationsPourquoi Rx

5

Pattern Observer

Pattern initialPattern Observer

7

Dans RxJavaPattern Observer

• Basé sur ce pattern

• Ajout d’opérateurs divers (agrégation, inspections de séquences, …)

• Ecriture fonctionnelle

8

Classes principalesPattern Observer

• Observable

• Observer

• Subscription

• Scheduler

9

3 méthodes principalesPattern Observer

• OnNext• Appelée après chaque évènement

• OnError• Appelée lorsqu’une erreur survient

• OnCompleted• Appelée à la fin de la séquence

10

Exemple d’Observer: classe complètePattern Observer

11

Exemple d’Observer: actions rapidesPattern Observer

12

ConnectableObservablePattern Observer

• Cold Observable

• Hot Observable

• Non synchronisé par défaut

• Connect() synchronise les Observers

13

Séquences

CréationsSéquences

• Les séquences sont au coeur de RxJava

• Elles sont toujours créées à l’aide de méthodes statiques

• Quelques exemples…

15

CréationsSéquences

from()

16

CréationsSéquences

from()

17

CréationsSéquences

create()

18

CréationsSéquences

• Et il en existe pleins d’autres :• just(), repeat(), repeatWhen(), defer(), range(), interval(),

timer(), empty(), error(), never().

• Une extension (rxjava-async) permet de créer des Observables à partir de fonctions.

19

Inspection de séquences

InspectionSéquences

• Les séquences peuvent être inspectées.

• Les méthodes suivantes peuvent être utilisées :• all(), contains(), exists(), isEmpty(), sequenceEquals()

21

Agrégation de séquences

AgrégationSéquences

• RxJava propose des opérateurs d’agrégation courants

• Ils vont permettre de présenter la donnée sous une forme qui va faciliter son exploitation

• Ils sont en partie inspirés d’opérateurs fonctionnels.

• Quelques exemples…

23

AgrégationSéquences

reduce()

24

AgrégationSéquences

collect()

25

AgrégationSéquences

• L’opérateur reduce est aussi présent, ainsi que d’autres permettant de convertir la séquence en Collections (toList(), toMap(), toSortedList(), …)

• Une extension (rxjava-math) permet de faire des agrégations sur des nombres

• Deux autres opérateurs permettent de faire des agrégations sur des String uniquement, join() et stringConcat()

26

Backpressure / Gestion d’erreurs

Méthodes filtrantesBackpressure

• throttleFirst

• throttleLast

• debounce

28

Concepts alternatifs: bufferBackpressure

29

Concepts alternatifs: windowBackpressure

30

Principes de baseGestion d’erreurs

• Aucune exception levée hors de l’Observable par défaut

• Si onError lève une exception, celle ci remonte dans une OnErrorFailedException

• OnErrorNotImplementedException est levée si l’Observer n’a pas de onError

• CompositeException encapsule l’ensemble des exceptions

31

Principes avancésGestion d’erreurs

• OnErrorResumeNext

• OnErrorReturn

• Retry

32

Principes avancésGestion d’erreurs

• OnErrorResumeNext

• OnErrorReturn

• Retry

33

Principes avancésGestion d’erreurs

• OnErrorResumeNext

• OnErrorReturn

• Retry

34

Combinaison de séquences

Combinaison de séquences

• Répond aux besoins de fusion entre plusieurs sources de données.

• Permet d’arbitrer des sources de données concurrentes.

• Permet de corréler les événements issus de plusieurs sources de données.

36

FusionCombinaison de séquences

concat()

37

FusionCombinaison de séquences

startWith()

38

ConcurrenceCombinaison de séquences

amb()

39

ConcurrenceCombinaison de séquences

merge()

40

CorrélationCombinaison de séquences

zip()

41

Concurrency

SchedulerConcurrency

• Basée sur des Schedulers fourni par RxJava :• computation()• from(Executor)• immediate()• io()• newTread()• trampoline()

• Peuvent être utilisés directement

• Mais il existe des raccourcis

43

Concurrency

subscribeOn() - observeOn()

44

Démo

Conclusion

Conclusion

• Framework uniquement pour la gestion d’évènements

• Ne sert pas à faire des appels asynchrones

• Framework complexe qui demande du temps de prise en main

• Utilisé dans des outils open source: Hystrix, rx-vertx

47