Enterprise JavaBeans : composants Java d'entreprise.
Fournir un modèle de composants Java pouvant être :
Les composants EJB peuvent représenter des :
Chaque composant EJB est mis en œuvre par un ensemble d'objets :
Les composants trouvent les éléments externes (autres EJB, sources de données, files de messages, etc.) auxquels ils veulent accéder via un annuaire compatible JNDI.
Une fois définis, les composants EJB peuvent être assemblés en un module EJB. On résoud alors, entre composants de ce module, les dépendances :
Une fois assemblé, un module EJB peut être déployé dans un conteneur EJB. On résoud alors, pour les composants de ce module, les dépendances avec l'environnement de déploiement, telles que les dépendances de :
L'API des EJB est définie dans le package javax.ejb
.
Un EJB est développé à partir de :
EntityBean
pour un EJB EntitéSessionBean
pour un EJB SessionMessageDrivenBean
pour un EJB asynchroneEJBObject
pour proposer une interface distribuableEJBLocalObject
pour proposer une interface localeLa recherche des éléments externes doit s'effectuer en interrogeant le contexte de nommage de l'environnement du composant :
<strong>java:comp/env/</strong>ejb/AutreEJB
<strong>java:comp/env/</strong>jdbc/UneDataSource
<strong>java:comp/env/</strong>jms/UneFileDeMessages
<strong>java:comp/env/</strong>eis/UnConnecteurJCA
Au moment du déploiement, les noms recherchés dans cet environnement local seront associés à des noms absolus d'objets déployés dans le serveur (tout ou partie de cette résolution de nom peut également s'effectuer lors de l'assemblage, s'il s'agit de désigner d'autres EJB locaux au module de l'EJB appelant).
Exemples
Un exemple de classe d'instance d'EJB Entité 2.0 est :
import <strong>javax.ejb</strong>.*;<br> <br> <strong>public abstract</strong> class SkillTree implements
<strong>EntityBean</strong> {<br> <span class="codeComment"> /** <br>
* Constructeur par défaut, toujours vide <br>
*/</span><br> public SkillTree() {}<br> <br> <strong>public </strong>SkillKey <strong>ejbCreate </strong>(Skill
someRootSkill) throws <strong>CreateException </strong>{ <br> setRoot (someRootSkill);<br> return null; <span class="codeComment">// En CMP
la clé est déduite</span><br>
} <br> <br> <span class="codeComment"> /**<br>
* Accesseurs CMP<br>
*/ </span><br> <strong>public abstract</strong> Object getRoot();<br>
<strong>public
abstract</strong> void setRoot (Object);<br> <br> public void <strong>ejbStore</strong>() {<br> <span class="codeComment"> // Rien à faire ici<br>
</span> }
public void <strong>ejbLoad</strong>() {<br> <span class="codeComment"> // Rien à faire ici<br>
</span> }
public void <strong>ejbRemove</strong>() {<br> <span class="codeComment"> // Rien à faire ici<br>
</span> }
public void <strong>ejbActivate</strong>() {<br> <span class="codeComment"> // Rien à faire ici<br>
</span> }
public void <strong>ejbPassivate</strong>() {<br> <span class="codeComment"> // Rien à faire ici<br>
</span> }
public void <strong>setEntityContext</strong> (EntityContext someContext) { <br> ejbContext = someContext;
<br> } <br> <br> public void <strong>unsetEntityContext</strong>() { <br> } <br> <br> private
<strong>EntityContext </strong>ejbContext;<br>
}
EJB | Version | 1 | 2 | 3 | Commentaire | |||
---|---|---|---|---|---|---|---|---|
Technologie | Release | 0 | 1 | 0 | 1 | |||
Sessions | Stateless | OuiOui | Sans état conversationnel (donc optimisables en étant partagés par plusieurs clients) | |||||
Stateful | Avec état conversationnel (optimisés via pooling) | |||||||
MDB | Non | Oui | Message-Driven Bean. Invoqué par des messages asynchrones (JMS) | |||||
Entités | CMP | Champs simples | N/A | Attributs | Accesseurs abstraits | |||
Langage de requête | N/A | Dépendant de l'implémentation | EJB QL | |||||
Relations | N/A | Manuel | Accesseurs abstraits, intégrité | Container-Managed Persistence : la persistance du composant est automatisée par le conteneur. | ||||
BMP | BMP | N/A | Oui | Bean-Managed Persistence : le composant gère lui-même sa persistance. | ||||
POJO | Champs simples | N/A | Oui | |||||
Langage de requête | N/A | EJB QL | ||||||
Relations | N/A | Oui | ||||||
Invocation | Distribuée | Distribuée | Oui | Inter-processus. | ||||
Locale | Locale | Non | Oui | Intra-processus (JVM). | ||||
Service Web | Service Web | Non | Oui | Invoqué par des messages SOAP. | ||||
Timer | Timer | Non | Oui | Invoqué par le temps. | ||||
IIOP | IIOP | Non | Oui | Protocole de transport. | ||||
Descripteur | Référence EJB | Référence EJB | Non | ejb-ref |
Réference relative à un autre EJB | |||
Réference ressource | Réference ressource | Non | resource-ref |
Annotations resource | Réference relative à une ressource (DataSource, ConnectionFactory, etc.) | |||
Référence rôle | Référence rôle | Non | role-ref |
Référence relative à un rôle de sécurité | ||||
Environnement de ressource | Environnement de ressource | Non | resource-env-ref |
|||||
Type d'identité d'exécution | Type d'identité d'exécution | RUN_AS_MODE |
Non | run-as-mode |
Propagation, spécifique ou système. | |||
Identité d'exécution | Identité d'exécution | RUN_AS_IDENTITY |
Non | run-as-identity |
Identité si type d'identiié spécifique. | |||
Descripteur | Format | Objet sérialisé dans un fichier | XML | |||||
Transaction | Requise | Requise | REQUIRED |
Required |
Utilise si existante, sinon démarre une nouvelle | |||
Nouvelle requise | Nouvelle requise | REQUIRES_NEW |
RequiresNew |
Démarre toujours une nouvelle (suspend celle en cours si besoin) | ||||
Supporte | Supporte | SUPPORTS |
Supports |
Ne démarre rien, utilise le contexte courant. | ||||
Non supportée | Non supportée | NOT_SUPPORTED |
NotSupported |
Ne peut intégrer ses actions dans une transaction. | ||||
Obligatoire | Obligatoire | Non | Mandatory |
Nécessite une transaction. | ||||
Jamais | Jamais | Non | Never |
Refuse toute transaction. | ||||
Niveau d'isolation | ISOLATION_LEVEL |
Non | Spécifique aux SGBD |
On peut reprocher aux EJB :
champ.collection.champ
dans EJBQL contrairement au contains()
de JDO)
On ne peut pas reprocher aux EJB < 3 :