Post on 12-Aug-2019
Chapitre 3: Architectures distribuéesEntrepriseJavaBeans (EJB)
Limitationsdesarchitecturesn-tiersclassiques• leserveurd’applicationconstituelapierreangulairedel'architectureetsetrouvesouventfortementsollicitéetilestdifficilederépartirlachargeentreclientsetserveur.
• Onseretrouveconfrontéauxépineuxproblèmesdedimensionnementserveuretdegestiondelamontéeenchargerappelantl'époquedesmainframes.
• Etlessolutionsmisesenœuvresontrelativementcomplexesàmainteniretlaréutilisationdescomposantsestpresqueimpossible.
Verslesarchitecturesn-tiersdistribuées
Entreprise Java Beans
ArchitecturedesEJB
Enterprise JavaBeans (EJB) • est une architecture
distribuée offrant des composants logiciels déployés côté serveur.
• Cette architecture propose un cadre pour créer des composants distribués et facilement réutilisables.
ArchitecturedesEJB
• Les EJB sont hébergés au sein d'un conteneur EJB évoluant dans un contexte transactionnel.
• Ils permettent de :1. représenter des données
(EJB Entity), 2. de proposer des services
avec ou sans conservation d'état entre les appels (EJB session),
3. ou encore d'accomplir des tâches de manière asynchrone (EJB dit message).
LesversionsdesEJB
• Stateful sessionetStatelesssession
• Interfaces:HomeRemote
LesversionsdesEJB
• BeanEntitéet• ledescripteurde
déploiementXML
LesversionsdesEJB
• IntroductiondeLocaleinterfacepourlepassageparréférence.
• miseenchargedesrequêtesSQL
LesversionsdesEJB
• Priseenchargedesservicesweb,
• EtdesprotocolesSOAPandHTTP.
LesversionsdesEJB
• Unfocussurleease ofuse,
• RemplacementdesspécificationsduBeanEntityparJPA,
• Introductiondel’Injectiondeladépendance
• Lifecyclecallbacks
LesversionsdesEJB
• Ease ofuse,again !• Unenouvelle
annotationfaitsonapparition: @Schedule
• lesméthodesdessessionsbeans peuventêtreappeléesdefaçonasynchrone
• Aveclaversion3.1,lesstateful webservicesserontaussisupportés.
TypesdesEJB
Ilexistetroistypesd'EJB :• lesbeans desession(sessionbeans)• lesbeans entité(lesentity beans)• Depuislaversion2.0desEJB,ilexisteuntroisièmetypedebean :lesbeans orientésmessage(messagedriven beans).
BeanSession
• Lessessionbeans peuventêtrededeuxtypes :sansétat(stateless)ouavecétat(stateful).
• Lesbeans desessionsansétatpeuventêtreutiliséspourtraiterlesrequêtesdeplusieursclients.
• Lesbeans desessionavecétatnesontaccessiblesquelorsd'unouplusieurséchangesaveclemêmeclient.
BeanEntité
Lesbeans entitésassurentlapersistancedesdonnées.Ilexistedeuxtypesd'entity bean :• persistancegéréeparleconteneur(CMP:Container
Managed Persistence).Avecunbean entitéCMP(container-managed persistence),c'estleconteneurd'EJBquiassurelapersistancedesdonnées.
• persistancegéréeparlebean (BMP:BeanManagedPersistence).Unbean entitéBMP(bean-managedpersistence),assurelui-mêmelapersistancedesdonnéesgrâceàducodeinclusdanslebean.
Message-driven Bean
• Lesbeans orientésmessages(message-driven beans)peuventêtreutilisésdansuncontexted’appelsasynchrones.
Avantages
• Lesservices(systemlevel)sontassurésparleconteneurEJB
• Encapsulationdelalogiquemétier
• Réutilisationdelalogiquemétier
Session Bean
SessionBean
Unbean sessionestuntyped'EJBqui:• implémentel'interfaceSessionBean•représentel'étatd'unseulclientdansunserveur.
LestypesdeSessionBean
Ilexistedeux typesdebeans session,• Stateful (avecétat)• stateless.(sansétat)
Stateless
Utiliser unbean sessionsansétat(stateless)si:
• Lebean n’enregistre pasdesdonnéesd’unclient
• lebean doitfaireunappeldeméthode.
• lebean estutilisé pourextraire desdonnéesd'unebasededonnéessanspersistance danslasession.
• Pourconsulter enlecture seuledesdonnéespersistantes.
Stateful
Utiliser unbean sessionavecétat(stateful)si:
• Lebean enregistre desdonnéesd’unseulclient particulier pendantladuréed’appeldeplusieurs invocationsdeméthodes(commeunesessiond’unnavigateurWeb).
• LemêmeBeanestutilisé pourservir touslesappelsdumêmeclient
Stateless Session Bean
Stateless SessionBean:cycledevieUn java bean stateless a deux états possibles ; soit iln'existe pas ( "état inexistant" ) soit il est dans un "étatprêt"; il ne peut pas être dans un "état passif »1. si le besoin de se servir d'un java bean session
stateless se fait sentir, le conteneur d'EJB crée etmaintient un pool de java beans sessionstateless, exécute toutes les injections dedépendance et invoque la méthode annotéeavec @PostConstruct si elle existe.
2. Le java bean est, à partir de ce moment, dansl' "état prêt " à l'emploi (i.e qu' un client peut faireappel à ce java bean).
3. A la fin du cycle de vie, le conteneur d'EJB appelle laméthode annotée avec @PreDestroy (s' il en existeune) et ainsi l'instance du java bean est mise à ladisposition du ramassemiette (garbage collection) .
InterfaceLocalouRemote• Annotations
• @javax.ejb.Local• @javax.ejb.Remote
• Exemple:importjavax.ejb.Remote;@RemotepublicinterfaceCalculatriceItf{publicdoubleadd(doublev1,doublev2);publicdoublesub(doublev1,doublev2);publicdoublemul(doublev1,doublev2);publicdoublediv(doublev1,doublev2);}
Stateless SessionBean:ImplémentationAnnotations
@StatelessExemple :
Clientlocal• TypiquementuneservletouuneJSPcolocaliséesurlemêmeserveurquelebean
• Mécanismedit"injectiondedépendance• attributdutypedel'interface• Annoté@EJBExemple:publicclassClientServletextendsHttpServlet{@EJBprivateCalculatriceItfmyBean;publicvoidservice(HttpServletRequestreq,HttpServletResponseresp){
resp.setContentType("text/html");PrintWriterout=resp.getWriter();double result=myBean.add(12,4.75);out.println("<html><body>"+result+"</body></html>");}
}
• Récupérationdelaréférenceversl'annuaireJNDI• Recherchedubeandansl'annuaire• Appeldesméthodesdubean• Exemple:
publicclassClient {public staticvoidmain(Stringargs[])throwsException {
javax.naming.Context ic=newjavax.naming.InitialContext();CalculatriceItf bean=(CalculatriceItf) ic.lookup("foobar");double res=bean.add(3,6);
}}
Clientdistant
Stateful Session Bean
Stateful SessionBean:cycledevie1. le client initie le cycle de vie d'un bean session
stateful en obtenant sa référence. Ainsi le container exécute toutes les Injections de Dépendance, invoque la méthode ayant l'annotation @PostConstruct s' il en existe une;
2. à partir de là le bean session stateful passe à l' "état prêt" i.e qu'il peut-être utilisé par un client.
3. Pendant le temps où le java bean est dans l'"état prêt", le conteneur d'EJB peut le faire passer dans un état passif.
4. Alafinducycledeviedujava bean,leclientinvoquelaméthodeavecl'annotation @Remove, etleconteneurd'EJBquantàluifaitappelà celle ayantl'annotation@PreDestroy;
Stateful SessionBean:Implémentation
SessionBeanStateful
• 2annotationsprincipales:• @Stateful:déclareunbeanavecétat• @Remove:définitlaméthodedefindesession,lasessionexpireàl'issudel'exécutiondecetteméthode
• Exemple@Stateful
publicclassCartBean implements CartItf{
privateListitems=newArrayList();privateListquantities=newArrayList();
publicvoidaddItem(intref,intqte){...}publicvoidremoveItem( intref){...}
@Remove
publicvoidconfirmOrder() {...}
}
Singleton Session Bean
SingletonSessionBean
il est possible de définir un EJB qui aura les caractéristiques du design pattern singleton : • le conteneur garantit
qu'une seule instance de cet EJB sera utilisable et partagée dans le conteneur.
• Un EJB singleton est utilisé principalement pour partager ou mettre en cache des données dans l'application.
SingletonSessionBean:Avantages
L'avantage des EJB Singleton c'est qu'ils offrent tous les services d'un EJB : sécurité, transaction, injection de dépendances, gestion du cycle de vie …
SingletonSessionBean
Message Driven Bean
MessageDriven Bean:Définition
• Message-Drivenbeans =beans accessiblesparmessaging asynchrone• NouveautéapparueavecEJB2.0,• Messaging =moyendecommunicationléger,comparéàRMI-IIOP,• Pratiquedansdenombreuxcas.
MessageDriven Bean:Casd’utilisation
UtiliserunMessageDriven Beansi:• LeBeandoitêtreexécutélorsqu’unmessageestarrivé.
• Lemessagedoitêtretraitéd’unemanièreasynchrone.
MessageDriven Bean:Motivation
• Performance• UnclientRMI-IIOPattend pendantqueleserveureffectueletraitementd'unerequête,
• Fiabilité• Lorsqu'unclientRMI-IIOPparleavecunserveur,cedernierdoitêtreentraindefonctionner.S'ilcrashe,ousileréseaucrashe,leclientestcoincé.
• Pasdebroadcasting !• RMI-IIOPlimitelesliaisons1clientvers1serveur
Messaging
• C'estcommelemail!Oucommesionavaitunetroisièmeentitéentreleclientetleserveur!
Messaging
• MessageOriented Middleware(MOM)estlenomdonnéauxmiddlewaresquisupportentlemessaging.
• Tibco Rendezvous,IBMMQSeries,BEATuxedo/Q,MicrosoftMSMQ,Talarian SmartSockets,ProgressSonicMQ,Fiorano FioranoMQ,…
• Cesproduitsfournissent:messagesavecgarantiedelivraison,toléranceauxfautes,load-balancing desdestinations,etc…
TheJavaMessageService(JMS)
• LesserveursMOMsontpourlaplupartpropriétaires:pasdeportabilitédesapplications!
• JMS=unstandardpournormaliserleséchangesentrecomposantetserveurMOM,
• UneAPIpourledéveloppeur,• UnServiceProviderInterface(SPI),pourrendreconnecterl'APIetlesserveursMOM,vialesdriversJMS
JMS:MessagingDomains• Avantdefairedumesaging,ilfautchoisirundomaine
• Domaine=typedemessaging
• Domainespossibles• Publish/Subscribe(pub/sub):nproducteurs,nconsommateurs(tv)
• PointToPoint(PTP):nproducteurs,1consommateur
JMS:lesétapes
1. Localiser ledriverJMS• lookup JNDI.Ledriverestuneconnection factory
2. Créeruneconnection JMS• obteniruneconnection àpartirdelaconnection
factory
3. Créerunesession JMS• Ils'agitd'unobjetquivaserviràrecevoiret
envoyerdesmessages.Onl'obtientàpartirdelaconnection.
4. Localiser ladestination JMS• Ils'agitducanal,delachaînetélé!Normalement,
c'estrégléparledéployeur.Onobtientladestination viaJNDI.
5. Créerunproducteur ouunconsommateur JMS• Utiliséspourécrireoulireunmessage.Onles
obtientàpartirdeladestination oudelasession.
6. Envoyer ourecevoir unmessage
JMS:lesinterfaces
JMS:exempledecode(1)
JMS:exempledecode(2)
Note : Dans 3) false = pas de transactions, AUTO_AKNOWLEDGE = inutile ici puisqu’on envoie des messages.
IntégrerJMSetlesEJB
• Pourquoicréerunnouveautyped'EJB?• Pourquoinepasavoirdéléguéletravailàunobjetspécialisé?• Pourquoinepasavoiraugmentélescaractéristiquesdessessionbeans?
• Parcequeainsionpeutbénéficierdetouslesavantagesdéjàrencontrés:cycledevie,pooling,descripteursspécialisés,codesimple…
Qu'est-cequ'unMessage-DrivenBean?
• UnEJBquipeutrecevoirdesmessages• Ilconsommedesmessagesdepuislesqueuesoutopics,envoyésparlesclientsJMS
Qu'est-cequ'unMessage-DrivenBean?
• Unclientn'accèdepasàunMDBviauneinterface,ilutilisel'APIJMS,• UnMDBn'apasd'interfaceHome,LocalHome,Remote ouLocal,• LesMDBpossèdentuneseuleméthode,faiblementtypée:onMessage()
• ElleaccepteunmessageJMS(BytesMessage,ObjectMessage,TextMessage,StreamMessage ouMapMessage)
• Pasdevérificationdetypesàlacompilation.• Utiliserinstanceof aurun-timepourconnaîtreletypedumessage.
• LesMDBn'ontpasdevaleurderetour• Ilssontdécouplésdesproducteurs demessages.
• LesMDBnerenvoientpasd'exceptionsauclient(maisaucontainer),• LesMDBsontstateless…
DévelopperunMessage-Driven Bean• LesMDBs doiventimplémenterpublic interface javax.jms.MessageListener {
public void onMessage(Message message);
}
public interface javax.ejb.MessageDrivenBean
extends EnterpriseBean {
public void ejbRemove()
throws EJBException;
public void setMessageDrivenContext(MessageDrivenContext ctx)
throws EJBException;
}
• Laclassed'implémentationdoitfourniruneméthodeejbCreate() quirenvoitvoid etquin'apasd'arguments.
DévelopperunMessage-Driven Bean
• Méthodesquidoiventêtreimplémentées• onMessage(Message)
• Invoquéeàchaqueconsommationdemessage• UnmessageparinstancedeMBD,poolingassuréparlecontainer
• setMessageDrivenContext(MessageDrivenContext)• AppeléeavantejbCreate,sertàrécupèrerlecontexte.• Necontientquedesméthodesliéesauxtransactions…
DévelopperunMessage-Driven Bean
Unexemplesimple
• UnMDBquifaitdulogging,c'estàdireaffichedesmessagesdetextesàl'écranchaquefoisqu'ilconsommeunmessage.
• Utilepourdébugger….
• Rappel:pasd'interfaces!
Laclassedubean
Laclassedubean(suite)
Question?
• Commentsait-onquellequeueouqueltopicdemessageslebeanconsomme?
• Celan'apparaîtpasdansledescripteur!
• C'estfaitexprèspourrendrelesMDBportablesetréutilisables.• L'informationsetrouvedansl’@ActivationConfigPropertyaudébutducode
Leclient(1)import javax.naming.*;
import javax.jms.*;
import java.util.*;
public class Client {
public static void main (String[] args) throws Exception {
// Initialize JNDI
Context ctx = new InitialContext(System.getProperties());
// 1: Lookup ConnectionFactory via JNDI
TopicConnectionFactory factory =
(TopicConnectionFactory)
ctx.lookup("javax.jms.TopicConnectionFactory");
// 2: Use ConnectionFactory to create JMS connection
TopicConnection connection =
factory.createTopicConnection();
Leclient(2)
// 3: Use Connection to create session
TopicSession session = connection.createTopicSession(
false, Session.AUTO_ACKNOWLEDGE);
// 4: Lookup Destination (topic) via JNDI
Topic topic = (Topic) ctx.lookup("testtopic");
// 5: Create a Message Producer
TopicPublisher publisher = session.createPublisher(topic);
// 6: Create a text message, and publish it
TextMessage msg = session.createTextMessage();
msg.setText("This is a test message.");
publisher.publish(msg);
}
}
MessageDriven Bean:Implémentation
• Considéronslacréationd’unbean quipermetd’extraireuntexteenvoyéparunclientpourqu’ilsoitutiliséparuneautreapplication.
• Pourcommencer,ilfaututiliserl’annotation@MessageDriven,enspécifiantletypedemessagequiserapriseencharge(jms/Queue)
MessageDriven Bean:Implémentation
• Parlasuiteondéfinituneclassepubliqueimplémentantl’interfaceMessageListener,quicontientlamethodeonMessage(Messagemsg)responsabledelalogiquemétier.
The JMS API Programming ModelThe basic building blocks of a JMS application consist of• Administered objects: connection factories and
destinations• Connections : A connection encapsulates a virtual
connection with a JMS provider.• Sessions : A session is a single-threaded context for
producing and consuming messages.• Message producers : A message producer is an object
that is created by a session and used for sendingmessages to a destination.
• Message consumers : message consumer is an objectthat is created by a session and used for receivingmessages sent to a destination.
• Messages : abasic formatthat is simplebuthighly flexible,allowing you tocreate messages that matchformatsused bynon-JMSapplications onheterogeneous platforms.
JMSMessagingModels
In publish-and-subscribe messaging, one producer cansend a message to many consumers through a virtualchannel called a topic.
The point-to-point messaging model allows JMS clients to send and receive messages both synchronously and asynchronously via virtual channels known as queues.
Retoursurlepackaging
• Unfichierd’archived’entreprise(EAR)• ModuleEJB(.jar)• Moduleweb(.war)• Applicationcliente(.jar)• Module‘ResourceAdapter’(.rar)• ....
• Chaquefichierd’archive(ear,war,raroujar)contientundescripteurdedéploiement(fichierxml)
Retoursurlepackaging
• Ledescripteurdedéploiementsertàdéfinirlesparamètresdedéploiementd’uneapplication(ear)oud’unmodule
• Exemples:• application.xml:déclarerl’ensembledesmodulesintégrésdansunfichier(.ear)
• ejb-jar.xml:configurerlesEJBdansunmoduled’unfichier(.jar)• web.xml:configurerlesparamètresdumoduleweb(servlets,JSP,TagLib..)d’unfichier(.war)
Structured’unfichierEAR
Racine de l’application (.ear)
META-INF Module Web(.war)
Module EJB(.jar)
Module RessourceAdapter
(.rar)
Module applicationCliente(.jar)application.xml
sun-application.xmljboss-application.xml