Invoker JBoss

Un EJB est accessible à distance par RMI (Remote Method Invocation) qui s'appuie de façon standard sur le protocole réseau propriétaire JRMP (Java Remote Method Protocol). JBoss propose une alternative à ce protocole avec « RMI sur http ».


Principe des invokers JBoss

Dans JBoss, les invokers implémentent la communication entre le client et le serveur distant. L'invoker par défaut s'appuie sur JRMP, en respectant le modèle de thread de la spécification J2EE. Il est classiquement remplacé par le « pooled invoker », qui traite les requêtes RMI via un poll de threads ou, de façon moins classique, par le « http invoker ».

JbossInvoker.png

La modification d'invoker peut se faire EJB par EJB, dans le fichier META-INF/jboss.xml ou de façon globale, par profil d'EJB, dans le fichier conf/standardjboss.xml.

Mise en oeuvre de « http invoker »

Pour que cela fonctionne, il faut que le répertoire http-invoker.sar soit déployé ; c'est le cas dans la configuration par défaut. Il faut ensuite configurer JNDI et RMI pour qu'ils utilisent http.

Configuration JNDI / http

La configuration se fait dans le fichier jndi.properties du client.

java.naming.provider.url=http://myserver:8080/invoker/JNDIFactory

Configuration RMI / http

La configuration se fait dans le fichier conf/standardjboss.xml du serveur.

<invoker-proxy-binding>
  <name>stateless-rmi-invoker</name>
  <invoker-mbean>jboss:service=invoker,type=jrmp</invoker-mbean>
  ...
</invoker-proxy-binding>

Est remplacée par

<invoker-proxy-binding>
  <name>stateless-rmi-invoker</name>
  <invoker-mbean>jboss:service=invoker,type=http</invoker-mbean>
  ...
</invoker-proxy-binding>

Compression http

La compression des flux http n'est pas prise en compte par les invocateurs de JBoss.

Pour ajouter cette fonctionnalité coté serveur, il existe 2 techniques :

  1. Ajouter un filtre de compression / décompression à l'application Web « invoker ».
  2. Activer l'option de compression sur le connecteur Coyote de Tomcat

Pour ajouter cette fonctionnalité coté client, il faut modifier l'invoker afin d'ajouter les tâches de compression / décompression au niveau du proxy.

JbossGzipFilter.png

Compression http dans Tomcat

L'activation de la compression par Tomcat se fait par l'ajout de l'option « compression="force" » dans le connecteur http Coyote. Il est possible de paramétrer un nouveau connecteur http, dédié aux flux compressés (fichier deploy/jbossweb-tomcat55.sar/server.xml).

<Connector port="8090" compression="force" />

Ce connecteur doit être pris en compte dans un nouvel invoker (fichier deploy/http-invoker.sar/META-INF/jboss-service.xml).
Cet invoker est implémenté par 3 classes (info.jtips.jboss.GzHttpInvoker, GzHttpInvokerProxy et GzHttpUtil) inspirées des classes de l'invoker http standard de JBoss. Le jar contenant ces classes doit être déployé dans le répertoire lib de la configuration de JBoss ainsi que sur le poste client. Le détail de ces classe est listé en annexe.

<mbean code="info.jtips.jboss.GzHttpInvoker"
       name="jboss:service=invoker,type=gzhttp">
   <attribute name="InvokerURLPrefix">http://</attribute>
   <attribute name="InvokerURLSuffix">
       :8090/invoker/EJBInvokerServlet
   </attribute>
   <attribute name="UseHostName">true</attribute>
</mbean>

La configuration des EJB stateless doit être modifiée dans le fichier conf/standardjboss.xml du serveur, afin d'utiliser cet invoker.

<invoker-proxy-binding>
  <name>stateless-rmi-invoker</name>
  <invoker-mbean>jboss:service=invoker,type=gzhttp</invoker-mbean>
  ...
</invoker-proxy-binding>

L'avantage de cette mise en oeuvre est sa simplicité au niveau de Tomcat et la possibilité de faire cohabiter des communications compressées et non compressées. En revanche, cette solution limite la compression aux réponses.

Compression http avec un filtre

Le filtre de compression / décompression doit être installé dans l'application http-invoker.sar/invoker.war. Les essais ont été réalisés avec un composant open source (http://www.netspade.com/software/java/compression-filter/) ; ce composant ne pourra pas être utilisé car sa licence est incompatible avec le projet (GNU GPL).

Le filtre (netspade-compression-filter.jar) s'installe dans le répertoire deploy/http-invoker.sar/invoker.war/WEB-INF/lib. Il se paramètre dans le fichier deploy/http-invoker.sar/invoker.war/WEB-INF/web.xml.

<filter>
   <filter-name>compress</filter-name>
   <filter-class>
       com.netspade.servlet.compress.CompressionFilter
   </filter-class>
</filter>

<filter-mapping>
   <filter-name>compress</filter-name>
   <url-pattern>/compress/*</url-pattern>
</filter-mapping>

L'invoker doit être adapté à cette configuration.

<mbean code="info.jtips.jboss.GzHttpInvoker"
      name="jboss:service=invoker,type=gzhttp">
  <attribute name="InvokerURLPrefix">http://</attribute>
  <attribute name="InvokerURLSuffix">
      :8080/invoker/compress/EJBInvokerServlet
   </attribute>
  <attribute name="UseHostName">true</attribute>
</mbean>

Dans la version actuelle, le filtre fait uniquement de la compression de réponses. Il est possible de le faire évoluer vers une compression des requêtes, bien que cela semble plus complexe.
La configuration proposée permet également de faire cohabiter des communications compressées et non compressées.

Remarques :
Cette configuration a été testée avec JBoss 4.0.2, configuration dérivée de « default », sous Windows XP pro.

Annexe : GzHttp Invoker