mercredi 2 octobre 2013

Java EE 7 : Bonne nouvelle?

Oracle a présenté en Juin la version finale de Java EE 7, et on peut déjà l'utiliser avec Glassfish 4.
Cela fait très longtemps que je n'ai pas parlé de Java EE (ou de Spring) sur ce blog.
En effet d'autres technologies bien plus innovantes ont fait leur apparition sur la JVM côté serveur depuis quelques années. Cependant je vous propose aujourd'hui un petit billet d'humeur sur cette nouvelle spécification.

Certains voient Java EE 7 comme une déception car un certain nombre de fonctionnalités liées au Cloud ont été abandonnées pour cette release.
Personnellement, je vois les choses un peu différemment. Il existe déjà des façons efficaces de travailler en mode Cloud et multi-tenant, et standardiser un tel fonctionnement au niveau des serveurs d'application ne me semble être d'une grande urgence.

Néanmoins d'autres fonctionnalités intéressantes font leur apparition dans Java EE 7.

Vous pouvez trouver la liste complète des modifications ici.
A côté des mises à jour de JSF, JPA, EJB... 3 spécifications retiennent mon attention.

Servlet 3.1, WebSockets et Web Services asynchrones

Cette nouvelle version de notre bonne vieille API Servlet apporte des améliorations du côté de la gestion des threads et offre un support amélioré des actions asynchrones. En effet, même si un mode asynchrone a fait son apparition avec les Servlet 3.0, seules les I/O bloquantes étaient autorisées, ce qui signifie avoir en permanence 1 thread par utilisateur actif. Servlet 3.1 autorise les I/O non bloquantes et permet de décorréler le nombre de threads du nombre de connexions. Ceci fait tomber certaines limites en terme de scalabilité et permet d'envisager de nouveaux modes de communication asynchrones comme les WebSockets. 

Les WebSockets sont déjà supportées depuis quelques années par Jetty, Play Framework, Node.js...
Elles permettent d'ouvrir une connexion bilatérale entre le navigateur et le serveur et d'envoyer les messages dans les 2 sens pour effectuer des actions asynchrones. On peut s'en servir notamment pour faire du "push" de données vers le client ou pour créer des interfaces Web riches, par exemple des jeux.
Elles sont désormais standardises dans Java EE et supportées par la plupart des navigateurs.

Enfin, JAX-RS 2.0 (Web Services REST) propose lui aussi, en plus d'une API cliente bien utile, un fonctionnement asynchrone avec la possibilité d'obtenir côté client un résultat nécessitant un traitement long sur le serveur. Ce résultat sera encapsulé dans un objet de type Future (avec les défauts de la version actuelle des Future en Java mais ceci mériterait un post séparé).
On peut également implémenter l'asynchronisme côté serveur avec JAX-RS 2.0. La réponse peut être suspendue en attendant le résultat, puis renvoyée au client, dans le style long polling/Comet. Vous trouverez quelques exemples intéressants sur cette page.

En conclusion, oui l'arrivée de Java EE7 est une bonne nouvelle et pas mal de retard sur les stacks concurrentes a été rattrapé. La mise à jour de l'API Servlet, sur laquelle un très grand nombre de frameworks Java repose, est une avancée importante pour l'écosystème Web Java.
On peut aussi noter que JSF 2.2 permet désormais de travailler en mode stateless, ce qui va dans le sens de la simplification des architectures côté serveur.

Malgré tout, on a pas encore le support de toutes les spécifications qu'on aimerait trouver dans une pile Web. Server Sent Events par exemple, plus propre que le moyen proposé par JAX-RS 2.0 et plus simple que WebSocket pour faire du simple push serveur-client, n'est pas encore proposé (bien que disponible dans Glassfish et Jersey). Les "concurrency utilities" proposées dans Java EE7 sont aussi loin du niveau de frameworks comme Akka et ne simplifient pas réellement l'approche que l'on peut avoir de la concurrence.

On peut faire un parallèle avec les dernières versions d'Internet Explorer, qui comblent un certain retard tout en ayant du mal à se tenir au niveau de la concurrence.
Mais c'est une position plus logique et cohérente pour Java EE qui se doit de standardiser des technologies et des solutions matures et éprouvées. Cette nouvelle version a donc le mérite de faire avancer les choses et ouvre des perspectives intéressantes.