Professional Documents
Culture Documents
Java2EnterpriseEdition
PierreYvesGibellopierreyves.gibello@experlog.com Misejour:30Septembre2004
CedocumentestcouvertparlalicenceCreativeCommonsAttributionShareAlike. ThisworkislicensedundertheCreativeCommonsAttributionShareAlikeLicense.
J2EEObjectifs
Faciliterledveloppementdenouvelles applicationsbasedecomposants Intgrationaveclessystmesdinformation existants Supportpourlesapplicationscritiques delentreprise
Disponibilit,tolranceauxpannes,monteen charge,securit...
J2EECestquoi?
http://java.sun.com/j2ee Spcifications Modledeprogrammation Implmentationderfrence Suite(s)detests LabelJ2EESun(qualificationdeplateformes)
Offrecommerciale
BEAWebLogic(hautdegamme) IBMWebsphere(no1) SunJavaSystemApp.Server BorlandEnterpriseServer Oracle9iApplicationServer MacromediajRun SAPWebapplicationserver IonaOrbixE2A
Offreopensource
JBoss(no1ennombrededploiements) ObjectWebJOnAS(no2,intgrplusieurs distroLinuxEntreprise) ApacheGeronimo(dmarragefin2003) openEjb ejBean
J2EEsouslildeDarwin...
Standardenvolutiondepuis1997
J2EE1.01.4en2003,etc...
Audpart,applicationsWebntiers
Prsentation(ServletspuisJSP),essentiellement HTTP Logiquemtier:EJB Donnes:JDBC
PuisinfrastructuredesupportstandardpourEAI
Facteursderationnalisationmajeurs(JTA,JMS,JCA, WebServices) EvolutiondeprogicielsexistantsversJ2EE
J2EEArchitecture
Browser WEBContainer
html
http
Servlets JSPs
Applets
rmi rmi
EJBs
JCA JAAS
JavaMail
DB
rmi
public staticvoid main(){
JavaApplication
J2EEApplicationServer
Architecturemultitiers
Client
Lger(Web,browser) Lourd(Applicationjava,Applet) Architectureorienteservice(Application rpartiesansprsentation)
Serveurdapplications
ConteneurEJB+logiquemtier Servicesnonfonctionnels
EISouBasededonnes
UnserveurJ2EE
Source:Bull/ObjectWeb(JOnAS)
JavaClient
RMICalls WebContainer
Home interface Remote interface
JOnASJ2EEServer
EJBContainer
Enterprise Enterprise Enterprise JavaBean JavaBean JavaBean
Servlets HTTP
Management
Transaction
Database
Naming
EJB
Ear
HTMLClient
Web
JDBCCalls
database
...
Services
ConteneurWeb
Servlets Codejavaexcutsurleserveur EquivalentduCGI GnrationdecontenuWebdynamique JSP:JavaServerPages MlangedeHTML/XMLetdecodejava Librairiesdextension(taglibs) Prcompilationenservlet
RMI
RemoteMethodInvocation
Javaseulement,maispasserelles
JNDI
Servicedenommage/annuaire
JavaNamingandDirectoryInterface
APIaccsauxannuaires
javax.naming ServiceProviderparannuairecible(LDAP, NIS,RMIregistry)
UtilisationaveclesEJB
Accslinterfacehomepourinitialiser Accsdiversesressources(UserTransaction, QueuesJMS,DataSources)
JMS
JavaMessagingService JMSProvider:inclusdansJ2EE
Transportsynchroneouasynchrone,Garantie delivraison Messagingdomainspointpointou publish/subscribe
LienavecEJB:messagedrivenbean
Pourchangesasynchrones
APIJ2EEdetransactions:JTA
JavaTransactionAPI Packagejavax.transaction
TransactionManager:begin(),commit(), rollback() Transaction:commit(),rollback(), enlistResource(XAResource), registerSynchronisation(Synchronization)... Synchronization:beforeCompletion(), afterCompletion(commit|rollback)
JTA:Participants
XAResource
ConformeslaspcificationXA Enregistmentavectransaction.enlistResource()
Synchronization
Pourlesressourcesnontransactionnelles(EAI) Participantavertidesfrontiresdetransaction enregistrement:transaction.registerSynchronization() beforeCompletion()quivautprepare() afterCompletion(tat=commit|rollback)quivaut commit|rollback
APIXAdeJ2EE
Packagejavax.transaction.xa
XAResource(prepare(),commit(),rollback()... Xid(identifiantdetransactionXA)
Packagejavax.sql
ExtensiondeJDBC(basesdedonnes) XADataSource(getXAConnection()) XAConnection(PooledConnection,avec getConnection()etgetXAResource())
JMX
JavaManagementeXtensions
APIuniquepourapplicationsdemanagement
Mbeansavecaccesseursget/set
Typagefaible,attributsnomms
ServeurJMX
EnregistrementdesMbeans Lesapplisdadministrationdialoguentavecle serveurJMX
Instrumenteruncomposant
FournirunoudesMbeans LesenregistrerauprsduserveurJMX
JMX:ExempledunserveurJ2EE
Source:ObjectWebJOnAS
EJBContainer WEBContainer
Adminconsole
EJBs
Admin Servlets
Transaction
EAR
JMXServer Management
Registry
Security
EJB
Web
..
MC4J
MBeans
Services
J2EEServer
EJB:Architecture
JavaBeanspourlEnterprise PasdesJavaBeans(pasdereprsentationgraphique) Logiquemtier SappuiesurJ2SEetlesAPIsdeJ2EE
JNDI,JTA/JTS,JDBC,JMS,JAAS
EJB:Gammedeservicesimplicites
Gestionducycledevie Gestiondeltat Scurit Transactions Persistance Localisationdescomposantstransparente (comparableobjetsdistribusCORBA) Rpartitiondecharge,pooling =>Ledveloppeursefocalisesurlesaspectsmtier
EJB
Lifecycleinterface create remove find Remote(rmi)ou Local Implementpar leconteneur Implementationducomposant: logiquemtier(code) callbackspourleconteneur (ejbCreate,ejbPassivate, ejbLoad,)
Home Client
Logiquemtier+ Callbacks+ ic=newInitialContext(); ds=(DataSource)ic.lookup( java:comp/env/jdbc/MyDS);
Composant
ConteneurEJB
EJB:Interfacecomposant
Remote(RMI)ouLocal VueclientdelEJB Declarelesmthodesmtier Implementeparlesoutilsintgrslaplateforme EJBaumomentdudploiement
Exemple:RemoteInterface
javax.ejb.EJBObject Hritede Interface Fournisseur //mthodesmtier +getNom():Nom +setNom(nom:Nom):void +getAdresse():Adresse +setAdresse( adresse:Adresse):void
EJB:HomeInterface
Interfacecomposantaccessibledistance(RMI) Reprsentelecycledevieducomposant(cration, suppression,recherche) Implementeparlesoutilsintgrslaplateforme EJB SparedelaRemoteInterfacecarellereprsente descomportementsnonspcifiquesuneinstance debean
Exemple:HomeInterface
javax.ejb.EJBHome Hritede Interface FournisseurHome //mthodesdegestiondecycledevie +create(id:Integer):Fournisseur +findByPrimaryKey( id:Integer):Fournisseur
EJB:ImplmentationduBean
HritedeEntityBeanouSessionBeanmais nimplmentepaslesinterfacesHomeouRemote Pourtant: Implmentelesmthodesmtierdelinterface Remote Dfinitetdclarelesmethodescorrespondant linterfaceHome.
Exemple:Implm.deBean
javax.ejb.EntityBean Interface Implmente FournisseurBean Class id:int nom:Nom adresse:Adresse //mthodesde gestiondecycledevie +ejbCreate( id:Integer):void +ejbFindByPrimaryKey( id:Integer):void //mthodesmtier +getNom():Nom +setNom( nom:Nom):void +getAdresse():Adresse +setAdresse( adresse:Adresse):void
EJB:Codeclient
Object ref ; FournisseurHome home; // Home interface Fournisseur fourn; // Remote interface, pas
le bean // appel JNDI pour obtenir une rfrence linterface Home
fourn = home.create(idFournisseur);
// appel mthode mtier
fourn.setNom(unNom);
EJB:BeanEntit
Reprsentedesdonnesdanslabasede donnes ContainerManagedPersistence(CMP)or BeanManagedPersistence(BMP)
EnmodeCMP,leconteneurEJBgrelapersistance dubean(pasdaccsBDdanslecode). EnmodeBMP,cestledveloppeurduBeanqui grelapersistance(parexemple,enJDBC).
EJB:BeanSession
Gestiondesinteractionsentrebeansentitou session,accsauxressources,ralisationdactions surdemandeduclient Objetsmtiernonpersistants StatefulouStatelessmaintientoupasuntat interneenmmoire =>UnBeanStatefulencapsulelalogiquemtieret ltatspecifiquesunclient
EJB:MessageDrivenBean
Composantasynchrone ExecutionsurrceptiondunmessageJMS
MthodeonMessage() Appelsdautresbeans,etc
Descripteurdedploiement
AssociationsBean/ressourceJMS RessourcesJMS(ex.QueueouTopic)
MessageDrivenBean:exemple
TX
EntityBeanStock MDBStockHandler Mise BD
jour
Envoi message
MDBOrder
publier
Topic
Queue
QCF
ServeurEJB
JMS
crer
crer bind
JNDI
Administration
MessageDrivenBean:exemple(2)
publicclassStockHandlerBeanimplementsMessageDrivenBean,MessageListener{ publicvoidonMessage(Messagemessage){ ... sh=(StockHome)initialContext.lookup("java:comp/env/ejb/Stock"); queue=(Queue)initialContext.lookup("java:comp/env/jms/Orders"); MapMessagemsg=(MapMessage)message; pid=msg.getString("ProductId"); qty=msg.getString("Quantity"); cid=msg.getString("CustomerId"); Stockstock=sh.findByPrimaryKey(pid); stock.decreaseQuantity(qty); qs=session.createSender(queue); TextMessagetm=session.createTextMessage(); Stringm="ForCustomerId="+cid+"ProductId="+pid+"Quantity="+qty; tm.setText(m); qs.send(tm); ... } }
EJB:Configuration& Dploiement
InterfacesHomeetRemote(ouLocal),classequi implmenteleBean Descripteurdedploiement(fichierXML)
<ejbjar> DescriptionduBean(EntityouSession,...) Ressources(Basededonnes,...) Securit:permissionsetroles Persistance(BMP,CMP) Attributstransactionnels </ejbjar>
=>Utilisparlassembleurdapplicationetparle conteneurEJBaumomentdudploiement
Descripteurdedploiement:Bean
Indirection: <enterprisebeans> Lienentre <entity> <description>EJBFournisseur(BMP)</description> interfaceset <ejbname>Fournisseur</ejbname> implmentation <home>logistique.FournisseurHome</home> <remote>logistique.Fournisseur</remote> <ejbclass>logistique.FournisseurBean</ejbclass> <persistencetype>Bean</persistencetype> <primkeyclass>java.lang.String</primkeyclass> <reentrant>False</reentrant> Persistance: <resourceref> Beanou <resrefname>jdbc/ClientDB</resrefname> Container <restype>javax.sql.DataSource</restype> <resauth>Container</resauth> </resourceref> Ressource: </entity> ici,BD </enterprisebeans> BeanEntit
RessourcesetJNDI
Ressourcesdclaresdansledescripteurde dploiement(accsviaJNDI) Conventiondenommage
Nomsprfixsparletypederessource rfrence(ejb,jms,jdbc,mail,url)
Exemple
fh=(FournisseurHome)initialContext.lookup( "java:comp/env/ejb/Fournisseur"); bd=(DataSource)initialContext.lookup( "java:comp/env/jdbc/Compta");
Indirection
ContratduconteneurentrelesclientsetlesEJB
Garantitquelonpasseparleconteneur Exemple:activation/passivation,pool dinstances...
RenommagedesmthodesdeHome
create()>ejbCreate(),etc... Exceptionsiappeldirect!(mthodeinexistante)
Indirection:implmentations
Gnrationdecode(JOnAS,WebLogic)
Codedinterpositionentrelebeanetle conteneur Gnrpartirdesinterfacesdubean Paramtrparledescripteurdedploiement
DynamicProxy(JBoss)
Pasdegnration/compilation Plussouple,maismoinsefficace
Optimisationslieslindirection
StatelessSessionBean:Sanstat
Pooldinstances Leserveurpeutyaccderviaunpooldethreads
StatefulsessionetEntitybeans
Activation/Passivation(appelparlecontainerde ejbActivate()aprsactivation/ejbPassivate()avant passivation)
Consquencesdelindirection...
Attentionthis...
Pasdethis.methode()surlesmthodes dinterfaceslocalouremote Eviterdepasserthisenparamtre
Utiliserlesrfrences!
Remote:context.getEJBObject() Local:context.getEJBLocalObject() Contexteinitialisparleconteneur appelsetSessionContextousetEntityContext aprslacration(mthodeimplmenter).
Descripteurdedploiement: Persistance
Beanmanaged(BMP) <persistencetype>Bean</persistencetype> Containermanaged(CMP) <persistencetype>Container</persistencetype> <cmpfield> <fieldname>codeFournisseur</fieldname> </cmpfield>
PersistanceBMP
Beanmanagedpersistence
Lebeangresapersistance Exemple:usagedirectdeJDBC
Appelsdemthodesparleconteneur
ejbLoad()restaurerltat ejbStore()sauvegarderltat MthodesjamaisappelesparleBean!(nepas appelerdepuisactivate/passivate)
PersistanceCMP
Persistancegreparleconteneur
Gestiondclarative(descripteurdedploiement) Champspersistants(avecmthodesget/set) RelationsentreinstancesdentitsCMP(CMP2) (cardinalit11ou1N,unioubidirectionnel)
EJBQL(CMP2)
BassurSQL92(selectfromwhere) Mthodesfindassociesdesrequtesavec paramtres
ExempleCMP:Homeinterface
publicinterfaceBookHomeextendsEJBHome { publicBookcreate(Stringid,Stringauthor) throwsRemoteException,CreateException; publicBookfindByPrimaryKey(Stringid) throwsRemoteException,FinderException; publicCollectionfindByAuthor(Stringauthor) throwsRemoteException,FinderException; }
CMP:Descripteurdedploiement
<entity>
<displayname>Book</displayname><ejbname>Book</ejbname> <home>BookHome</home><remote>Book</remote><ejbclass>BookEJB</ejbclass> <persistencetype>Container</persistencetype> <primkeyclass>java.lang.String</primkeyclass> <cmpfield><fieldname>title</fieldname></cmpfield> <cmpfield><fieldname>author</fieldname></cmpfield> <cmpfield><fieldname>price</fieldname></cmpfield> <primkeyfield>title</primkeyfield> <query> <description></description> <querymethod> Inutiledimplmenterla <methodname>findByAuthor</methodname> mthodefindByAuthor() <methodparams> <methodparam>java.lang.String</methodparam> </methodparams> </querymethod> <ejbql>selectdistinctobject(b)fromBookbwhereb.author=?1</ejbql> </query> </entity>
CMP:MthodesfindetejbSelect
Findermethods(findBy)
Retournent1bean(interfacemtier)ouune Collection
MthodesejbSelect
EquivalentauxfindBy Localunbean(pasdaccsexterne)
Transactions
Applicableaux3profilsdecomposants
Session,Entit,Messagedriven
LimitationpourleMessageDriven(attributsRequiredou NotSupportedseulement).
Gestionexplicite
Utilisationdejavax.transaction.UserTransaction(JTA) Contrledelatransaction(timeout,rollbackOnly) Exemple
Descripteurdedploiement: GestiondclarativedesTransactions
<assemblydescriptor> <containertransaction> <method> <ejbname>Fournisseur</ejbname> <methodname>*</methodname> </method> <transattribute>Required</transattribute> </containertransaction> NotSupported ... Required </assemblydescriptor> RequiresNew Mandatory Supports Never
Gestiondclarativedestransactions
Auniveaudelamthodedubean!(dmarcation) NotSupported Required
Sitransactioncourante,elleestsuspendue Sipasdetransaction,nouvelletransaction Nouvelletransaction(sitxcourante,suspendue) Exceptionsipasdetransactioncourante Sitransactioncourante,lutiliser Exceptionsitransactioncourante
Gestiondesvnements transactionnels(SessionBean)
InterceptionparunEJBdesvnements transactionnels(produitsparleconteneur)
Implantationdejavax.ejb.SessionSynchronization
Evnements(appelsparleconteneur)
afterBegin:appelaprsUserTransaction.begin beforeCompletion:appelavant UserTransaction.commit afterCompletion(true|false):appelaprscommit ourollback
<assemblydescriptor> Dfinitionderle ... <securityrole> <description>Personneladministratifdegestion</description> <rolename>administratif</rolename> </securityrole> Permissionsaccordes <methodpermission> unrle <rolename>administratif</rolename> <method> <ejbname>Fournisseur</ejbname> <methodname>*</methodname> </method> </methodpermission> </assemblydescriptor>
Descripteurdedploiement: Scurit
JCA
JavaConnectorArchitecture IntgrationaveclesSIdentreprise(EIS)
Applications(ERP,SupplyChain) Middleware(gestionnairedetransactions)
Connecteurcomposde:
Contratssystme APIcliente ResourceAdapter
ContratsSystme
InteractionentreleSIetleserveur dapplications
Gestiondesconnexionsetpooling Gestiondestransactions(parleserveur dapplicationet/ouleSI) Scurit(accsscurisauSI)
APIclientes
Standard:CCI(CommonClientInterface)
Avantage:APIstandard Inconvnient:tropgnraletpeucomprhensible (pasdesensmtier),implmentation facultative.
Spcifique:APIspcifiqueauSI,fourniepar leresourceadapter
Avantage:APImtier Inconvnient:spcifiqueauSIconcern,donc diffrenteselonleconnecteur...
ResourceAdapter
ImplmentationdelinterfaageavecleSI
Classesdinterface LibrairiesnativesduSI
Descripteurdedploiement
Configurationduconnecteurauseinduserveur dapplication
Classesdimplmentationdesinterfacesstandard Fonctionnalitssupportesounon(transactions, scurit)
Dploiement
Packagingenfichier.rar(RAarchive)
Dployparleserveurdapplication Formatjaravecorganisationstandard Contienttousleslmentsduconnecteur Descripteurdedploiement(ra.xml)dans METAINF:configurationduconnecteur
Rlesdfinisparlaspec.EJB
Fournisseurdebeans
DveloppeurquicrelesEJB
Assembleurdapplication
CrelapplicationparassemblagedEJB
Administrateur
Dploiement,scurit,explotation,monteen charge AnalogueaurledeDBApourlesBD
Packaging
ApplicationJ2EE(aggrgariondediffrentstiers) Tiersclient
Fichier.ear+descripteurapplication.xml Web:fichier.war+descripteurweb.xml Application:fichier.jar+descripteur applicationclient.xml(lancementdumain()dela classespcifiedanslemanifest,attributMain Class) Fichier.jar+descripteurejbjar.xml Fichier.rar+descripteurrar.xml
TiersEJB
TiersEIS(connecteursJCA)
Persistance+Transactions:exemple
Conteneur EJB
DB1
EB1
DD
no cust
DB2
EJB
DBM
REG
JMX
R1
server2
Adminclient http
Conteneur EJB
EB2
JTM
Web
EJB
DBM
JMX
Appliclient
server1
JMX
R2
server3
Rpartitiondecharge:notations
Unnoeud(machine)quihbergeunouplusieursserveurs
web
ejb
web
ejb
web ejb
UnserveurquihbergeunconteneurWebetunconteneurEJB
Apache mod_jk
UnserveurApacheaveclemodulemod_jk
Rpartitiondecharge:scenarii(1)
RpartitionduserveurJ2EE
Compact
Rparti (auseindunmmenud)
Rparti
web ejb
web
ejb
web
ejb
Rpartitiondecharge:scenarii(2)
(1)
web ejb Apache mod_jk Apache mod_jk web
(2)
ejb
web ejb
web
ejb
(3)
web
RpartitiondechargeEJB Rplicationsessionhttp
web ejb
(4)
ejb
Apache mod_jk
Apache mod_jk
web
web
ejb
Rpartitiondechargeetclustering
Source:ObjectWebJOnAS Tomcat
JOnAS EJB Container JNDI
Apache Mod_jk
Tomcat
Tomcat
JNDI
JNDI
DB