Cet article est issu d'un document déjà publié sur mon site perso. Vous pouvez également
télécharger cet article au format pdf.
Je tiens à remercier :
Chrisophe Ludet pour m'avoir contacté afin de publier cet article,
Grégory Danelon pour la mise en forme et la publication de cet article,
? pour la correction orthographique.
1. Introduction
JonAS est serveur d'application Open Source de ObjectWeb qui implémente l'ensemble des
spécifications J2EE, et supporte les services Web. ObjectWeb est un consortium Open
Source sans but lucratif, sur le modèle de la fondation Apache. Son objectif est de fournir
un ensemble de logiciels middleware en Open Source. Il regroupe notamment l'INRIA, Bull,
France Télécom RD...
Jonas fournit :
Un conteneur DEJB (Stateless et Stateful session Beans, Entity Beans avec Bean-
Managed ou Container-Managed Persistance (CMP), Message-Driven Bean,
interfaces locales, etc
Un conteneur web pour les applications J2EE (Tomcat et Jetty)
Des transactions distribuées
Scalability
Support de sécurité
Gestion basée sur JMX
Intégration JMS
Services utilisateurs et intégrés pour une configuration et une adaptation du serveur
plus facile.
Le support des services Web, via l'intégration d'Axis (la conformité J2EE 1.4 est
également annoncée)
Une intégration renforcée avec les environnements de développement Eclipse,
JBuilder, et XDoclet.
Jonas a déjà été utilisé :
sur différents OS : Windows*, Linux, Solaris, AIX, HP-UX, Novell, etc.
sur différentes JVM
sur différentes base de données : Oracle, PostgreSQL, MySQL, SQL server, Access,
DB2, ObjectStore, Informix, Interbase, Versant,etc.
Jonas a été utilisé pour développer des projets à grande échelle de : e-commerce, e-portail,
système de management, application intranet, processing de documents, systèmes
dinventaire, applications bancaires, etc
2. Architecture de Jonas
Pour avoir une vue globale, on peut dire que Jonas s'appuie sur Tomcat ou Jetty pour son
conteneur WEB, et sur des composants du consortium ObjectWeb pour son ORB
(Jonathan), pour JMS (JORAM), et pour la persistance CMP2.0 (JORM). Il fournit par défaut
des mécanismes permettant une bonne tenue en charge, ainsi que des solutions de
clustering. Il s'administre à travers une console qui est elle-même une application web,
s'appuyant sur JMX. Il supporte le déploiement de connecteurs JCA, permettant l'accès aux
systèmes d'entreprise propriétaires.
3. Services et spécifications
Jonas est construit en termes de services (qui supportent les spécifications indiquées) :
EJB 1.1 : les conteneurs de EJB sont fournis par un set de classes Java
et un outil qui génère des classes dinterposition. Jonas dépend des projets JORM
et MEDOR dObjectWeb pour implémenter CMP2.0
JTA 1.0.1/JTM : le Transaction Manager fournis des API Java support de
transaction et de coordination de transaction distribuée.
JDBC 2.0 : un Manager de Database qui fournit un support de Connectivité
aux Bases de données.
JMS 2.0.1 : un service Java Messaging fournit par JORAM (implémentation
de JMS dObjectWeb), une technologie venant de ScalAgent. Jonas peut aussi supporter
dautres implémentation de JMS.
JMX : Jonas contient une technologie Java Management Extension. La gestion
et le monitoring sont accessible via une interface web (servlet basée sur GUI).
JCA 1.0 : Jonas supporte larchitecture J2EE Connector qui définit une série
de mécanismes permettant lintégration dEIS (Enterprise Information Systèmes).
(A Connector Resource Service for deploying JCA-compliant Ressources Adapters)
Un service de Gestion de la sécurité.
Un Web Container Service pour faire tourner un conteneur de serlet/jsp (Tomcat
ou Jetty) comme un service de Jonas, dans la même JVM.
Un service EAR pour déployer les applications archivées en fichiers EAR
Une série doutils pour concevoir, déployer et gérer des EJB.
Un service Mail qui fournit des composants dapplication avec les ressources
nécessaires pour envoyer des mails.
4. Les EJB
4.1. Définition
Les EJB (Enterprise JavaBeans) sont des composants Java portables, réutilisables et
déployables qui peuvent être assemblés pour créer des applications. Tous ce qui concerne
le domaine métier est pris en charge dans le tiers métier par des EJB. Ils s'exécutent dans
un conteneur EJB qui va leur fournir des services tels que les transactions ou la
persistance...
Ces composants ont plusieurs avantages :
Le conteneur EJB fournit aux Enterprise JavaBeans des services.
Le conteneur va être responsable de fournir aux EJB des services tels que la gestion des
transactions, des autorisations, de la persistance... Le développeur n'ayant plus à s'occuper
de ces choses, il peut se concentrer sur le développement de son EJB.
Les EJB contiennent la logique applicative.
Les applications clientes n'ont plus de routines contenant les règles métiers ou les accès
bases de données. Elles sont donc plus légères et plus souples.
Les EJB sont portables.
Une application peut être construire à partir d'EJB existants et être déployée sur n'importe
quel serveur compatible J2EE.
Un EJB reçoit les données du client , les traite si nécessaire, et les envoies vers le tiers
système dinformation de lentreprise pour stockage. Il peut aussi faire la manuvre inverse.
Il existe 3 EJB : session beans, entity beans, et message-driven beans.
session bean : représente une conversation transitoire avec le client. Quand le client
fini lexécution, le bean et les données disparaissent.
Entity bean : représente une données persistante qui est stockée dans une ligne de
table de base de données. Quand le client se déconnecte ou si le serveur séteint, les
services sous jacents se chargent de sauvegarder lentity bean.
Le message-driven bean combine les caractéristiques du session bean et de
lécouteur de message du JMS (Java Message Service), qui permet à un composant
métier de recevoir un message JMS asynchrone.
Les EJB de type "Session" : Ils exécutent une tâche pour le client.
Les EJB de type "Entity" : Ils représentent un objet métier qui existe dans le système de
stockage permanent ( par exemple : un client ou une facture ).
Les EJB de type "Message-Driven" : Ils permettent le traitement des messages
asynchrones.
4.2. Le conteneur EJB
Chaque instance d'un EJB se construit et vie dans un conteneur. Le conteneur est en fait un
environnement d'exécution fournissant des services aux Entreprise JavaBeans.
Parmis ces services, on a par exemple :
Les connexions à la base de données
Les transactions
La sécurité etc
4.3. Les différents types dEJB
4.3.1. Les EJB de type session
Un EJB de type session est chargé d'effectuer une tâche pour un client. Dans cette catégorie
d'Entreprise JavaBeans, il y a deux groupes :
Sans état : Un composant de session sans état ne maintient pas d'état
conversationnel. L'exemple typique est un convertisseur Euro/Franc qui aurait
une seule méthode : euroToFranc(double valeur). Toutes les invocations de
méthodes que vous ferez sur un EJB sans état que vous avez instancié ne seront
pas forcément traitées par le même EJB.
Avec état : Un composant avec état est dédié à un certain client pendant
toute la durée de son instanciation. Concrètement, si vous modifiez une variable
d'instance du composant, vous retrouverez cette valeur lors de vos prochains
appels. Pour résumer, toutes les invocations d'une méthode par le client seront
traitées par le même EJB.
-> Ce type d'EJB s'occupe des traitements.
4.3.2. Les EJB de type Entity
Ce type d'EJB peut désigner quelque chose de concret ( un client ou une facture ) ou
d'abstrait ( une enchère ou une réservation ). Sa caractéristique la plus importante est la
persistance, c'est à dire que ce composant existe physiquement sur un support de stockage
comme une base de données, un serveur LDAP ou un fichier XML.
La persistance modélisant les entity beans sont de deux types :
Bean-Managed Persistence, où le fournisseur de bean doit développer la méthode
daccès à la base de données en utilisant linterface JDBC.
Container-Managed Persistence, dont laccès à la base et le stockage sont
automatiquement géré par lenvironnement EJB. Le fournisseur na quà spécifier un
descripteur de bean contenant les informations à propos du mapping des champs dans
le schème de la base.
-> Ce type d'EJB s'occupe des données.
4.3.3. Les EJB de type Message-Driven
Un Message-Driven Bean est un EJB qui va permettre à votre application de traiter des
messages de manière asynchrone. En fait, cet EJB va réagir aux messages reçus au travers
de JMS ( Java Message Service).
-> Ce type d'EJB permet de traiter les données de manière asynchrone.
4.4. Cadre dutilisation des EJB
Les EJB sont particulièrement recommandés :
Lorsque lapplication doit pouvoir gérer des montées en charge.
On peut facilement mettre en cluster les serveurs d'application.
Lorsque lapplication a besoin des transactions.
Les EJB supportent les transactions (peu importe le système de stockage utilisé).
Lorsque lapplication doit être accessible depuis de nombreux types de clients (
Applications, Sites web, PDA... ).N'importe quel type de client pourra accéder aux EJB et
pourra utiliser la logique et les données de lapplication.
Lorsque lapplication est développée par plusieurs personnes.
Les EJB permettent de contenir, et donc de centraliser la logique applicative et ainsi
d'assurer l'intégrité des données et le respect des règles métiers. Les développeurs des
applications clientes peuvent se concentrer sur la présentation, il n'ont plus dans leurs codes
de règles métiers ni d'accès à la base de données.
4.5. Rédaction dun EJB
Le composant EJB se compose de 3 entités :
L'interface locale (Interface Home) qui définit les méthodes qu'un client peut invoquer pour
créer, trouver ou supprimer l'EJB . Elle est mise en oeuvre par le conteneur
lors du déploiement dans une classe appelé EJB Home.
L'interface distante (Interface Remote) qui contient les méthodes qu'un client de cet EJB
peut appeler . Elle est mise en oeuvre par le conteneur lors du déploiement dans une classe
appelée EJB Object. Le client du bean après avoir utilisé linterface EJB Home pour accéder
au bean, utilise cette interface pour appeler indirectement les méthodes métiers
implémentées dans la classe bean.
L'EJB qui est le composant ( classe du Bean). La classe encapsule les données associées
au bean et contient les méthodes métiers implémentées par le développeur qui permettent
daccéder à ces données. Elle renferme aussi les différentes méthodes utilisées par le
conteneur pour gérer le cycle de vie de ses instances.
Les trois fichiers qui suivent appartiendront au package sb (simple bean).
4.5.1. L'interface locale (Interface Home)
Cette interface définit les méthodes utilisées par un client pour créer, rechercher ou
supprimer des instances du bean. Elle est mise en oeuvre par le conteneur lors du
déploiement dans une classe appelé EJB Home.
Lorsqu'un client veut utiliser un EJB, il se sert de JNDI pour obtenir une référence à un objet
qui est une instance de l'interface locale. Comme vous pouvez le constater, la méthode
create() qui est appelée retourne un objet de type HelloWorld (type de notre interface
distante).
Le client va donc pouvoir utiliser cette instance du même type que l'interface distante pour
invoquer les méthodes de l'EJB.
4.5.2. Linterface distante (Interface Remote)
Cette interface va définir toutes les méthodes fonctionnelles ( business method ) qu'un client
peut invoquer sur notre composant. (elle spécifie l'ensemble des fonctions qu'un client peut
appeler).
L EJB implémente l'interface SessionBean ce qui nous oblige à implémenter les interfaces
suivantes :
ejbActivate()
ejbPassivate()
ejbRemove()
setSessionContext()
Ces méthodes sont invoquées par le conteneur pour notifier à votre EJB qu'un évènement
s'est produit.
La méthode setSessionContext() est appelée immédiatement après l'instanciation du
composant par le container. Elle reçoit un argument de type SessionContext que le
composant peut utiliser pour faire appel aux services du conteneur.
Après setSessionContext() le container appelle la méthode ejbCreate().
Note : Pour chaque méthode create() définie dans son interface locale, le composant doit
implémenter une méthode ejbCreate() correspondante, retournant void et contenant le
même nombre et le même type d'arguments que la méthode create() source.
4.6. Création des descripteurs de déploiement de lEJB
Pour un EJB, il y a deux descripteurs :
Le descripteur de déploiement standard de sun : Le programmeur de l'EJB doit fournir avec
son composant un descripteur de déploiement. Ce fichier décrit par exemple quelle classe
est l'implémentation, l'interface locale et l'interface distante de l'EJB.
Ce fichier doit s'appeler ejb-jar.xml. (cf annexe 1)
Le descripteur spécifique à JonAS : Certaines informations nécessaires au déploiement de
l'EJB dans JOnAS ne sont pas dans la DTD précédente. Pour résoudre ce problème, il faut
créer un autre descripteur de déploiement spécifique à JOnAS dont on peut trouver la DTD à
l'adresse suivante : http://www.objectweb.org/jonas/dtds/jonas-ejb-jar_2_4.dtd.
Le fichier spécifie le nom JNDI de l'objet qui est l'interface Home du bean. C'est ce nom JNDI
que les clients de notre application vont appeler pour accéder à l'interface locale de notre
EJB. Ce document devra s'appeler jonas-ejb-jar.xml. (cf annexe 1)
Attention : Lun des principaux avantages des EJB est leurs capacités à gérer des
transactions dune manière déclarative, et non pas codé dans lapplication serveur, au
moment de déploiement. Cest ce quon appelle le « Container-managed transaction
demarcation ». Le comportement dune transaction est défini au moment de la configuration,
et dans le descripteur de déploiement du bean.
4.7. Packaging de lEJB
LEJB doit être packagé dans une archive JAR qui devra contenir :
Les classes de lEJB,
Les 2 descripteurs de déploiement (ejb-jar.xml et jonas-ejb-jar.xml).
4.8. Déploiement de lEJB
Pour déployer l EJB sous JOnAS, le fichier ejb-jar doit posséder les classes d'interposition
lEJB avec les services offerts par le Serveur d'EJB. Ces classes vont être crées à l'aide de
l'utilitaire GenIC fourni avec JOnAS. Ensuite, pour déployer l EJB dans JOnAS, il suffira de
copier le fichier .jar vers le répertoire "C:\java\plateforme\jonas\ejbjars" et de modifier la
configuration de JOnAS.
5. Cadres fonctionnels
5.1. Accès aux bases de données pour les EJB
Laccès aux bases de données passent par des sources de données de type
javax.sql.DataSource. Ce composant (une factory) permet daccéder à un objet de type
java.sql.Connection permettant dexécuter et de traiter des requêtes SQL. La déclaration
de ces sources de données est faite dans le fichier %JONAS_ROOT%\jonas.properties.
jonas.datasources acces_1
Acces_1 représente un alias vers le fichier acces_1.properties contenant tous les
paramètres daccès à la base de données via JDBC :
Un entity bean dans le cas Bean-Managed Persistence ou un session bean vont définir
dans leur fichier de déploiement ejb-jar.xml laccès à ces ressources.
InitialContext it = new InitialContext();
DataSource ds = (DataSource)it.lookup("java:comp/env/jdbc/uneBase");
Connection connection = ds.getConnection();
On utilisera de préférence la méthode ejbCreate pour obtenir une connexion et linitialisation
des différents champs mappant une partie de la base. Pour optimiser la communication
client/serveur voir la fiche OPT_ETB_EJB_01.