Retour d'experience sur l'utilisation de spray dans le cadre de Mogobiz. Explication de la technique du "Magnet Pattern" et présentation des bénéfices de l'utilisation de Rx.
http://j.mp/psug43Xebia
18. ObjecLf:
• DSL composé de la foncLon host
• Masquer la complexité de host
19. ObjecLf:
• DSL composé de la foncLon host
• Masquer la complexité de host
Notre méthode host prend comme
paramètre plusieurs types en entré.
20. ObjecLf:
• DSL composé de la foncLon host
• Masquer la complexité de host
Notre méthode host prend comme paramètre
en entrée plusieurs types en entré.
Il faut le converLr implicitement
en Int (logique applicaLve pour
notre exemple)
=> l'evidence ev
21. ObjecLf:
• DSL composé de la foncLon host
• Masquer la complexité de host
Notre méthode host prend comme paramètre
en entrée plusieurs types en entré.
Il faut le converLr implicitement
en Int (logique applicaLve pour
notre exemple)
=> l'evidence ev
22. ObjecLf:
• DSL composé de la foncLon host
• Masquer la complexité de host
Notre méthode host prend comme paramètre
en entrée plusieurs types en entré.
Il faut le converLr implicitement
en Int (logique applicaLve pour
notre exemple)
=> l'evidence ev
23. !
<console>:24: error: type mismatch;
found : SprayTestsNoMagnet.Route
required: String => Int
new Route {}
^
24. !
<console>:24: error: type mismatch;
found : SprayTestsNoMagnet.Route
required: String => Int
new Route {}
^
25. val route = host("SprayTestsNoMagnet") ( new Route {} )
=
26. val route = host("SprayTestsNoMagnet") ( new Route {} )
=
Solu>on => Appel intermédiaire
29. Nous ne pouvons pas nous
contenter de ce/e solu1on si nous
é1ons entrain d'écrire un DSL
30. ==> Magnet « paMern » qui résout
entre autre ceMe probléma>que
Nous ne pouvons pas nous
contenter de ce/e solu1on si nous
é1ons entrain d'écrire un DSL
31.
32. // Notre nouveau Type HostMagnet est bien sensé renvoyer la même foncLon Route => Route
33. // Notre nouveau Type HostMagnet est bien sensé renvoyer la même foncLon Route => Route
// Le premier implicit est une conversion implicite qui nous permet d'obtenir
// une instance HostMagnet à parLr d'une string , en l'occurrence "mogobiz.io"
34. // Notre nouveau Type HostMagnet est bien sensé renvoyer la même foncLon Route => Route
// Le premier implicit est une conversion implicite qui nous permet d'obtenir
// une instance HostMagnet à parLr d'une string , en l'occurrence "mogobiz.io"
// host prend un paramètre de type HostMagnet
// et retourne une instance de HostMagnet
// magnet.apply()
35. scala> import SprayTestsWithMagnet._
import SprayTestsWithMagnet._
!
scala> val route = host("mogobiz.io") {
| new Route {}
| }
route: SprayTestsWithMagnet.Route = $anon$1@51f347a
!
scala> val x = host("mogobiz.io")
x: SprayTestsWithMagnet.Route => SprayTestsWithMagnet.Route =
<function1>
36. • Finaliser une requête HTTP
• DSL ==> « complete »
• Plusieurs manière de finaliser une requête
HTTP ==> Surcharger « complete »
Type erasure
LimitaLon pour les types paramètrés
37.
38. Nice, but
show me…
… some Magnet PaMern in Spray-‐rou>ng
39.
40. CeAe direcLve est uLlisée au sein
d'une val route qui est de Type
Route (spray-‐rouLng).
41. CeAe direcLve est uLlisée au sein
d'une val route qui est de Type
Route (spray-‐rouLng).
?
42. pathPrefix est une foncLon qui prend en paramètre un
PathMatcher et qui nous renvoi un objet de type Directive.
!
(cf. spray-‐rouLng/src/main/scala/spray/rouLng/direcLves/PathDirecLves.scala)
43. pathPrefix est une foncLon qui prend en paramètre un
PathMatcher et qui nous renvoi un objet de type Directive.
!
(cf. spray-‐rouLng/src/main/scala/spray/rouLng/direcLves/PathDirecLves.scala)
PathMatcher défini un implicite qui converL un String en
PathMatcher (conversion d’ "acount" en une instance de
PathMatcher)
(cf. spray-‐rouLng/src/main/scala/spray/rouLng/PathMatcher.scala)
44. pathPrefix est une direcLve,
qui prend en paramètre une closure
de type Route,
Et retourne une Route.
45. pathPrefix est une direcLve,
qui prend en paramètre une closure
de type Route,
Et retourne une Route.
==> Conver1r implicitement la
Directive en une fonc1on qui
prend un paramètre de type Route
et renvoi un résultat de Type
Route (Route => Route)
49. • Notre Objet Magnet est la Directive
• pathPrefix est exécuté une seule fois; lors du chargement de
l'applicaLon (Spray) transformé en Directive
• La Directive est transformée en une foncLon qui prend en
paramètre; la Route entre accolade
• Tout ce qui produit une Directive est exécuté au chargement de
spray (get, path, pathPrefix, completed, )
• Spray va stocker ceAe informaLon et ne va pas l'évaluer à chaque fois.
• Par contre, les définiLons des closures seront chargés mais non
exécuté.
53. spray-client
• non adapté dans certain cas d’uLlisaLon (Mogobiz)
• Appel de plusieurs Index ElasLcSearch en parallèle
• Appliquer des traitement (Suppression des langues,
calcul du prix)
• ComposiLon + dépendance des Futures
==> Complexité d’implémentaLon
==> Nous perdons la simplicité du DSL spray-‐client
54. RxJava
• ImplémentaLon par Nexlix
du Projet Rx (ReacLve
Extensions) hAp://
codeplex.com/ de Microsoy
• Bibliothèque permeAant de
composer des programmes
événemen>els asynchrone,
via l’uLlisaLon de séquences
observables.