23 juillet 2014
Tags : java8, CompletableFuture
TweeterJe vais aujourd’hui vous présenter les CompletableFuture de java 8.
Pour l’exemple, nous allons réaliser un petit programme Java permettant de récupérer le titre le plus long parmi les articles du blog.
Pour faire cela, nous allons récupérer la page archive du blog, pour ensuite récupérer chaque lien d’article et pour finir récupérer le titre des articles.
Commençons par la méthode naïve sans java8 :
Cette méthode a l’intérêt d’être très facilement compréhensible, par contre c’est beaucoup trop séquentiel, il faudrait pouvoir exécuter les requêtes en parallel et non de manière séquentiel.
Nous allons maintenant exécuter les requêtes en parallel à l’aide d’un bon vieux ExecutorService :
Cette méthode est beaucoup plus performante, mais un truc me gène :
boolean allDone = false;
while (!allDone) {
allDone = true;
for (Future<String> result : results) {
if (!result.isDone()) {
allDone = false;
break;
}
}
Thread.sleep(50);
}
Avoir du code technique de ce type là en plein milieu, ça me plait pas trop.
UPDATE : Comme on me l’a fait remarquer sur twitter, il est tout a fait possible de supprimer ce bloc, l’attente étant gérée par le get.
Cependant on ne voit plus de notion de “tout les traitements terminés”, ce qui dans un cas plus complexe peux être très utile.
Nous allons maintenant transformer notre code pour utiliser les CompletableFuture de java8 :
Personnellement je trouve ce code beaucoup plus lisible et sans (ou très peu de) code technique.
Quelques détails sur l’API :
Voici les résultats des trois méthodes en terme de performances :
Pour les curieux, l’ensemble de ma classe de test se trouve ici.
11 juin 2014
Tags : java8, javascript, SimpleWeb4j, websocket
TweeterNous allons voir comment faire du websocket avec SimpleWeb4j.
WebSocket est un protocole permettant la communication de type push entre un browser et un serveur de manière bi-directionnelle.
Comme je suis super original, on va partir sur un chat (le truc pour discuter, pas l'animal !), ça nous rappellera la grande époque de caramail :)
Pour mettre en place un chat, on a besoin d'un service côté serveur qui peut recevoir des messages en push depuis les clients, et quand il en reçoit un le redistribue à tous les clients.
Nous allons commencer par créer notre objet métier représentant un message, celui-ci contient l'utilisateur, le texte et la date du message. Il servira pour les messages que l'on envoie aux clients (pour les flux client -> serveur, nous utiliserons une simple String).
Nous allons maintenant créer la route de la websocket avec la méthode SimpleWeb4j.websocket, cette méthode prend en paramètre une String représentant l'url et un WebSocketAdapter. Un WebSocketAdapter et une factory qui contient une méthode prenant en paramètres les "RouteParameters" et qui construit un WebSocketListenner. On a donc le code suivant pour l'instant :
Voyons maintenant comment construire le "WebSocketListener", nous avons pour ça un builder. Nous souhaitons construire un listener en implémentant un comportement sur 3 événements :
Pour la partie cliente, on a un objet javascript "WebSocket" qui prend l'url en paramètre du constructeur.
Il nous reste après à définir les callback "onmessage" et "onopen". Pour envoyer un message au serveur, il suffit d'utiliser la méthode WebSocket.send. Si vous voulez plus de détails, vous pouvez aller voir la page de mozilla.
Voici donc la page html complète, comme d'habitude, j'utilise angular.js :) >/p>
Alors, ça vous parait compliqué de faire du WebSocket?
04 juin 2014
Tags : EventSource, java8, reactive, Server-Sent-Events, SimpleWeb4j, SSE
TweeterNous avons vu hier un exemple simple de Server Sent Events avec SimpleWeb4j, passons maintenant à plus complexe, un exemple dit "réactif", ce n'est pas le flux qui demande la valeur suivante, mais bien un "service" extérieure qui déclenche l'envoi à tous les flux ouverts.
Pour l'exemple, nous allons créer trois générateurs d'événements, avec chacun un délai aléatoire entre les événements.
Nous allons donc tout d'abord créer une classe "Event", cette classe contient un nom, une valeur et l'heure de création. La valeur est créée de manière aléatoire.
Nous allons ensuite créer un générateur, qui est un Runnable infini, et envoi des événements aux handlers SimpleWeb4j.
Un handler SimpleWeb4j est une classe fournie par SimpleWeb4j qui contient une méthode "next" permettant d'envoyer les événements. Nous stockerons ces handlers dans un ConcurrentHashSet pour pouvoir tous les adresser (et pas seulement le dernier flux créé.
Une fois tous ces composants créés, il suffit de déclarer la route, voici donc le résultat final :
J'espère vous avoir montré l'intérêt de SimpleWeb4j sur ce cas beaucoup moins simple que le précédent.
Si le sujet vous intéresse, vous pouvez regarder ma présentation donnée au Breizhcamp sur parleys :
03 juin 2014
Tags : EventSource, java8, Server-Sent-Events, SimpleWeb4j, SSE
TweeterJe vous ai montré hier comment faire du SSE avec Jetty. Nous allons maintenant voir comment faire avec SimpleWeb4j.
L'exemple avec jetty était une horloge déclenchée toutes les secondes à partir de l'accès à l'url, voyons donc comment coder cela avec SimpleWeb4j : Simple, non?
Dans la vrai vie, on souhaite sans doute pouvoir déclencher simplement l'envoie d'un événement sans être dépendant d'un délai quelconque. Ce sera l'objet de l'article de demain :)
02 juin 2014
Tags : EventSource, java8, Jetty, Server-Sent-Events, SSE
TweeterJe vais aujourd'hui vous présenter comment faire du Server-Sent-Events (EventSource) avec Jetty.
Si vous avez déjà lu w3c, passez au chapitre suivant :)
La technologie Server Sent Events (ou EventSource du nom de l'API javascripts) est une technologie permettant de faire du push du serveur vers le client en gardant une connexion ouverte.
Un des gros avantages selon moi de cette technologie est sa simplicité, c'est du texte sur HTTP. Chaque événement est préfixé de "data: ", et on met deux retours à la ligne pour séparer les événements (je simplifie un peu).
Le plus simple est encore de vous montrer le code :)
Demain, je vous montrerai que c'est quand même beaucoup plus simple d'utiliser SimpleWeb4j pour le faire :)
29 mai 2014
Tags : java8
TweeterLe sujet du jour est de réaliser un petit filtre de Servlet pour stocker le nombre d'appels pour chaque url.
Pour réaliser cela, il suffit de lire la javadoc de ConcurrentHashMap et plus particulièrement :
A ConcurrentHashMap can be used as scalable frequency map (a form of histogram or multiset) by using LongAdder values and initializing via computeIfAbsent. For example, to add a count to a ConcurrentHashMap<String,LongAdder> freqs, you can use freqs.computeIfAbsent(k -> new LongAdder()).increment();
L'implémentation est donc très simple :
L'affichage n'est pas plus compliqué :
On a donc une gestion de stats thread safe et performante en une ligne de code :)
26 mai 2014
TweeterAprès bientôt un an sans écrire d'article, je vais essayer de me remettre à écrire des trucs... Je ne garanti pas que ce soit intéressant :)
Le premiers de cette renaissance sera sur les caches simples en Java.
Je parle ici de cache non révocable (j'en ai eu besoin très récemment). Voici la classe permettant de faire ceci :Vous l'aurez compris, cet article cherche a vous présenter la méthode ConcurrentHashMap.computeIfAbsent, cette méthode est apparue en Java 8.
Cette dernière permet donc de remplir notre Map si la clé est absente, et ce de manière Thread safe!
J'espère pouvoir publier le prochain article dans moins d'un an, à bientôt donc :)