Cedric Dumoulin (C) The Java EE 7 Tutorial http://docs.oracle.com/javaee/7/tutorial/doc/ Webographie The Java EE 7 Tutorial http://docs.oracle.com/javaee/7/tutorial/doc/ Les slides de cette présentation sont des extraits de ce tutorial Qu’est-ce qu’un Enterprise Bean (EJB)? C’est un composant coté serveur Il encapsule la logique métier d’une application Il est écrit en Java (c’est une classe POJO) Aussi appelé EJB (Enterprise Java Bean) Avantages des EJB Simplifie le développement de grande application distribuées. Le framework fournit les services de niveau systèmes (sécurité, persistence, transaction, …) L’EJB contient la logique métier Le développeur se concentre sur la logique métier Prône la séparation de la logique métier et de la présentation du client Les composants EJB sont portables Construction d’application par assemblage de composants Réutilisation Dans quelle applications utiliser des EJBs ? Si votre application a au moins un de ces besoins: Mise à l’echelle l’application doit supporter un grand nombre de clients L’application peut être distribuée sur plusieur machine L’intégrité des données doit être assuré par des transactions Les EJB supportent les transactions (de façon relativement transparente) Plusieurs types de clients La logique métier reste la même Les différents types d’EJBs Il existe 2 types Les EJB session Les Messages Driven Bean (MDB) Qu’est-ce qu’un EJB Session ? Un Bean Session encapsule la logique métier C’est une classe Java POJO Il peut être appelé programmatiquement par un client (ie par un autre code) Localement au container A distance (remote) Le client invoque les méthodes de l’EJB L’EJB effectue la tâche demandé par le client Il effectue la logique métier dans le serveur Un EJB session n’est pas persistant. 3 types de Bean Session Stateful Session Bean L’état d’un objet est constitué des valeurs de ses variables d’instance (ie ses attributs) Ce bean maintient l’état des variables d’instance entre 2 appels, et ce pour un client donné Stateless Session Bean Ne permet pas de maintenir des valeurs de variables Singleton Session Bean Instancié une et une seule fois pour une application Existe pout toute la durée de vie de l’application StateFul Session Bean Maintient un état conversationnel avec le client N’a qu’un seul client Maintient son état entre les appels de ce client Se termine si le client se termine Le container maintient un Stateful par client Stateless Session Bean Pas d’état conversationnel avec le client Le container maintient un pool de Stateless Session Bean Le container alloue un de ces bean au client Un Stateless a un client à la fois. réutilisation des instances Peut avoir moins de stateless que de client Quand utiliser un Stateful Session Bean ? The bean's state represents the interaction between the bean and a specific client. The bean needs to hold information about the client across method invocations. The bean mediates between the client and the other components of the application, presenting a simplified view to the client. Quand utiliser un Stateless Session Bean ? Si vous voulez améliorer les performanes et que votre bean à une des caractéristiques suivantes: The bean's state has no data for a specific client. In a single method invocation, the bean performs a generic task for all clients. For example, you might use a stateless session bean to send an email that confirms an online order. The bean implements a web service. Quand utiliser un Singleton Session Bean ? State needs to be shared across the application. A single enterprise bean needs to be accessed by multiple threads concurrently. The application needs an enterprise bean to perform tasks upon application startup and shutdown. The bean implements a web service. Message Driven Bean (MDB) C’est un bean permettant de traiter des messages de façon asynchrone Message == appel d’une méthode avec un paramètre (le message). Dans JEE, un MDB est un listener JMS (Java Messaging Service) Le message peut être envoyé Par n’importe quel composant JEE Par un client JMS Par du code Java Différence entre MDB et Stateless Session Bean Pas d’accès à travers une interface A part ca, il se rapproche d’un Stateless: MDB instances retain no data or conversational state for a specific client. All instances of a MDB are equivalent, allowing the EJB container to assign a message to any MDB instance. The container can pool these instances to allow streams of messages to be processed concurrently. A single MDB can process messages from multiple clients. MDB Un MDB peut contenir un état maintenu entre les appels des clients L’état est partagé entre les clients Utile pour maintenir une connexion sur une ressource (DB, file, mails, …) Un client n’appelle pas directement la méthode du MDB Il faut passer par JMS (poster le message dans une file d’attente) Quand un message arrive dans la file, le contener appel la méthode onMessage(…) du MDB Caractéristiques d’un MDB They execute upon receipt of a single client message. They are invoked asynchronously. They are relatively short-lived. They do not represent directly shared data in the database, but they can access and update this data. They can be transaction-aware. They are stateless. Quand utiliser un MDB Pour recevoir des messages de façon asynchrones Pour assurer la reception d’un message Le message peut être bufferiser par JMS JMS assure que le message sera délivré, y compris en cas de problème de connection Accéder au Session Bean Une session bean peut être accédé par Une vue sans interface Cad les méthodes public du bean Une (ou plusieurs )interface de domaine Interface Java définissant les méthodes exposées par le bean L’implémentation interne du bean n’est pas accessible par le client. L’interface et la vue sans-interface permettent de bien séparer l’utilisation du bean (vue client) de son implémentation Facilite la maintenance (peut changer l’implem) faire attention lors de la conception de l’interface Utiliser un bean dans un client Un client peut obtenir une référence sur une instance de bean Par injection (utilisation d’annotation Java) Par lookup JNDI Un client ne doit pas instancier directement un bean C’est le conteneur qui fait l’instanciation. Qui supporte l’injection Tous les clients fonctionnant dans un server JEE JavaServer Faces web JAX-RS web services, other enterprise beans, or Java EE application clients Utiliser l’annotation javax.ejb.EJB Sinon, utiliser un lookup avec JNDI Syntaxe JNDI portable Attention, certaines implementations JNDI ne supporte pas cette syntaxe Namespaces: java:global, java:module, et java:app Remote java:global[/application name]/module name /enterprise bean name[/interfacename ] Local, dans le même module (le même war, jar, rar) java:module/enterprise bean name/[interface name] Locale, dans la même application (le même EAR) java:app[/module name]/enterprise bean name [/interface name] Client local ou client remote? Tight or loose coupling of related beans Tight local Loose remote Type of client Application , sur une autre machine remote Sur la même machine local Component distribution remote Besoin de mise à l’échelle remote Performance local Details: 32.4.2 Deciding on Remote or Local Access Si incertain remote Peu aussi être local ET remote ! Client local A local client has these characteristics. ■ It must run in the same application as the enterprise bean it accesses. ■ It can be a web component or another enterprise bean. ■ To the local client, the location of the enterprise bean it accesses is not transparent. La vue sans interface et une vue local Une interface @Local @Local public interface InterfaceName { ... } @Local(InterfaceName.class) public class BeanName implements InterfaceName { ... } Accéder au Client Local Par la vue sans interface Utiliser la classe du bean Ou JNDI @EJB ExampleBean exampleBean; ExampleBean exampleBean = (ExampleBean) InitialContext.lookup("java:module/ExampleBean"); Par la vue domaine (interface locale) Utiliser le nom de l’interface locale Ou JNDI @EJB Example example; ExampleLocal example = (ExampleLocal) InitialContext.lookup("java:module/ExampleLocal"); Client distant (remote) Un client distant a les caractéristiques suivantes: It can run on a different machine and a different JVM from the EJB it accesses. (It is not required to run on a different JVM.) It can be a web component, an application client, or another enterprise bean. To a remote client, the location of the EJB is transparent. The enterprise bean must implement a business interface. remote clients may not access an enterprise bean through a no-interface view. Créer un client remote Soit décorer l’interface remote avec @Remote @Remote public interface InterfaceName { ... } Soit décorer le bean @Remote(InterfaceName.class) public class BeanName implements InterfaceName { ... } Communication client remote bean Transparent pour le programmeur Mais RMI derrière Obtenir le bean remote Par injection Utiliser l’interface remote @EJB Example example; Par lookup JNDI Utiliser l’interface remote ExampleRemote example = (ExampleRemote) InitialContext.lookup("java:global/myApp/ExampleRemote"); Constitution d’un EJB To develop an enterprise bean, you must provide the following files: ■ Enterprise bean class: Implements the business methods of the enterprise bean and any lifecycle callback methods. ■ Business interfaces: Define the business methods implemented by the enterprise bean class. A business interface is not required if the enterprise bean exposes a local, no-interface view. ■ Helper classes: Other classes needed by the enterprise bean class, such as exception and utility classes. Packager les fichiers Dans un EJB Jar Ou dans le WAR (WEBINF/classes) Convention de nommage des classes Cycle de vie d’un Stateful Session Bean Le système peut décider de « passiver » le bean Pour récupérer des ressources Peut utiliser des callback (par annotations) Cycle de vie d’un Stateless Session Bean Pas de passivation Car réutilisation par le conteneur Cycle de vie d’un Singleton Session Bean Cycle de vie d’un Message Driven Bean (MDB) Voir chap 26 avaeetutorial7 More information on Enterprise JavaBean The Java EE 7 Tutorial http://docs.oracle.com/javaee/7/tutorial/doc/ Enterprise JavaBeans 3.2 specification: http://www.jcp.org/en/jsr/detail?id=345 Enterprise JavaBeans web site: http://www.oracle.com/technetwork/java/ejb141389.html Enterprise JavaBeans 3.2 specification project: https://java.net/projects/ejb-spec/ Lectures The Java EE 7 Tutorial http://docs.oracle.com/javaee/7/tutorial/doc/ chap 1 à 5 chap 26 Enterprise Beans