ESIGate
Esigate 4.0 released

February 14th, 2013

Esigate 4.0 has just been released, along with a new home page.

Esigate is a reverse proxy, designed for integration purposes. A typical use is to merge PHP applications like Drupal, eZpublish, … with Java custom developments into a single, very fast web application.

The new website lists some successful users, including the French national railway company, Capgemini, Smile and others companies and public institutions.
We have more users to add to this list, but we are waiting for their authorization. Some of them can be found with simple google search :-) . If you are an esigate user, please get in touch with us to have your logo and name added to the site.

This release introduces a standalone server (it no longer requires a servlet engine) and an extension API making it easier to add new features and change default behavior.

Apache HttpClient now replaces the previous custom HTTP cache implementation. We worked with HTTP client team during the last months to fix several issues which where affecting esigate.

More information and downloads on the new esigate website.

Eclipse
Solve ClassNotFoundExceptions with Maven war projects on Eclipse

August 31st, 2012

When working on Maven web projects with Eclipse, m2e and m2e-wtp, Webapps can sometimes suddenly stop working, raising ClassNotFoundExceptions on every startup.

This is because the webapp lib folder is no longer published to the server. Cleaning, Publishing, Closing/opening project, restarting Eclipse, nothing restore this folder and its content. Additionally, a new warning appears in the problem view :

Classpath entry org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER will not be exported or published

To solve this issue, just open .classpath at the root of the project and add the following attribute to the maven classpath :

<attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>

Save and publish to the server.

The webapp should start again.

Source: Post from Eclipse forums http://www.eclipse.org/forums/index.php/t/262101/

Java
Free mobile: les erreurs du site d’inscription

January 25th, 2012

Le site de Free Mobile a connu beaucoup de problèmes le jour de l’ouverture de l’offre: impossibilité de s’inscrire, inscriptions non prises en compte, etc.

Ne tenant pas la charge, le site à été réécrit pendant la nuit, en effectuant au passage une transition de Java (Jsf) vers Php.

En partant de ce constat, le troll Java Vs PHP est facile, mais plusieurs erreurs de conception ont largement contribué à l’écroulement du site:

Avant l’ouverture:
Avant l’ouverture officielle des inscriptions, le site de Free Mobile affichait un message du type : “dans quelques instants vous pourrez consulter nos offres”

  • Première erreur: Rechargement automatique toutes les minutes.

    la page se rafraîchissait automatiquement toutes les minutes.
    En plus des rafraîchissements manuels effectués par les impatients, ce code à généré un surplus de connexions et surtout a agit comme une retenue d’eau : à l’ouverture du vrai site, l’ensemble des utilisateurs en attente y ont accédé dans la première minute.….

À l’ouverture
Le site utilisait un système de “slots” pour le processus d’inscription : seul un nombre limité d’utilisateurs pouvaient s’inscrire simultanément. Les autres devaient attendre.

  • Deuxième erreur: Rechargement automatique toutes les 5 secondes.

    Lorsqu’aucun slot était disponible, le site affichait une page d’attente qui se rechargeait automatiquement toutes les 5 secondes pendant plusieurs minutes.
    En réponse à une surcharge, le site a multiplié volontairement la charge au bas mot entre 12x et 60x.

  • Troisième erreur: Choix de JSF
    JSF est un framework par composants, orienté applications web (type intranet), qui a besoin de stocker en session, pour chaque utilisateur :
    • L’état de l’ensemble des composants de la page courante
    • Le même état pour les X dernières pages visitées pour permettre l’utilisation du bouton précédent

    … là où les frameworks orientés sites web publics ne stockent que l’identifiant de l’utilisateur, dans le cas où celui-ci est authentifié.

    Dans le cas de free mobile, toutes les inscriptions sont faites par des utilisateurs différents. Le volume de données à stocker est donc énorme et n’est pas adapté à la fonction du site.

    Il est possible dans JSF de reporter ces données coté utilisateur en les intégrant dans le code html, au prix d’une augmentation de la bande passante. Cette configuration n’était pas utilisée sur free mobile.

Après la refonte:
Le site fonctionne maintenant en PHP, mais on peut voir que les leçons ont été tirées des problèmes ci-dessus:

  • En cas de surcharge du site, la page d’erreur redirige immédiatement vers la page d’accueil. Il n’y a plus de rechargement automatique. La redirection est même suffisamment rapide pour empêcher les utilisateurs de recharger eux-même la page trop facilement. (Note: La page principale est statique.)
  • Le site est en php basique, sans utilisation de framework visible. On se doute qu’il n’y a quasiment pas de données en session, voir pas du tout

Conclusion

  • Les rechargement de page en javascript sont dangereux sur les sites à forte charge. Il faut porter une extrême attention à leur impact sur le dimensionnement. Il vaut mieux privilégier un rechargement manuel de la page par l’utilisateur
  • La session est un élément sensible des applications web. Pour un site a forte audience, il faut limiter drastiquement les données stockées, ce qui exclut naturellement un certain nombre de frameworks de type JSF.

    En cas de nécessité, il est possible de déporter les données sur des caches mémoire, tels que memcache, ehcache, cohérence.

  • Un rappel: l’architecture mise en place ne dépend pas du langage. Faire une application complexe (modèle composant, de multiples couches, plein de données en session) ou ultra-simple quelques lignes dans un fichier est un choix, qui est réalisable de façon sensiblement identique dans les différents langages.

J’en profite également pour placer le projet open source Stateless Filter qui permet de déporter de façon transparente les sessions d’applications Java coté client ou dans un cache mémoire.

Les retours sont bien sûr les bienvenus. Je mettrai à jour l’article pour quelques corrections si nécessaire…

Java
Transparent javascript and css compression with Maven3 and Yuicompressor

December 23rd, 2011

There are a lot of ressources on how to use YUIcompressor on a Maven project, but several examples don’t work with Maven3, or don’t allow to replace javascript and css by their compressed version transparently.

The following example will compress files transparently when packaging the webapp in a WAR file, and keep original files for development.

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-war-plugin</artifactId>
   <version>2.1.1</version>            
   <configuration>
      <warSourceExcludes>**/*.css,**/*.js</warSourceExcludes>
   </configuration>
</plugin>


<plugin>
   <groupId>net.alchim31.maven</groupId>
   <artifactId>yuicompressor-maven-plugin</artifactId>
   <executions>
      <execution>
         <id>compressyui</id>
         <phase>prepare-package</phase>
         <goals>
            <goal>compress</goal>
         </goals>
      </execution>

   </executions>
   <configuration>
      <nosuffix>true</nosuffix>
   </configuration>
</plugin>

Java
XmlField : new validation API

December 21st, 2011

XmlField 0.7 which was just released provides a new validation API, based on JSR 303, with some additions borrowed from Hibernate validation.

It is now very simple to ensure objects are valid, without complex XPath expressions or XPath duplication.

Add constraints to your interfaces :
@ResourceXPath("/database")
public interface IDatabase {
   @NotEmpty
   @FieldXPath("@name")
   String getName();

   @Size(min=1)
   @FieldXPath("tables/table")
   ITable[] getTables();
}

Validate :
IDatabase db = new XmlField().xmlToObject( xmlString, IDatabase.class );

Set<ConstraintViolation<Object>> violations = new XmlFieldValidator().validate( db );

Supported annotations :

  • @NotEmpty : value exists and is not blank
  • @Size : string length, array size
  • @Range : numbers between min and max
  • @Values : check for accepted values

Enjoy :-)

See also : Introducing XmlField : Java xml/object mapping framework