Vous êtes sur la page 1sur 63

J2EE

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

JDBC JMS JTA

Applets

rmi rmi
EJBs

JCA JAAS
JavaMail

DB

rmi
public staticvoid main(){

JNDI EJBContainer EIS

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

RPCobjet(appelssurobjetsdistants) Servicedenommage(RMIregistry) Scuritparamtrable(SecurityManager) GarbageCollectiondistribue Tlchargementdecode Fonctionsavances


Activationdobjetspersistents,Rplication

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

Gestiondclarative(personnalisationsanstoucherau codesource) PortablesurlesdiffrentsconteneursEJB

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,)

Descripteurdedploiement: comportementtransactionnel(Tx attributes) Scurit(ACLs) Persistance(entitybeans) Ressources(DataSources) DD

<resourceref> <..name>jdbc/MyDS <transattribute>Required

Home Client
Logiquemtier+ Callbacks+ ic=newInitialContext(); ds=(DataSource)ic.lookup( java:comp/env/jdbc/MyDS);

InterfaceMtier: Remote(rmi)ou local

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

ref = jndiContext.lookup( "java:comp/env/ejb/Fournisseur"); home = PortableRemoteObject.narrow(ref, FournisseurHome.class);


// crer un Bean

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

Appli: Client JMS

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...

Laclassedimplmentationnimplmentepas lesinterfacesHomeouRemote;pourtant,elle implmentelesmthodesdeHomeetRemote


Lelienestfaitparledescripteurdedploiement

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

UserTransactionutx= (UserTransaction)ctx.lookup(java:comp/UserTransaction); utx.begin(); utx.commit();

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

RequiresNew Mandatory Supports Never

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 admin WEB

SrVlt 2phase commit

Conteneur EJB

EB2

JTM

Web

EJB

DBM

JMX

Appliclient

server1

JMX

R2

server3

Rpartitiondecharge:notations
Unnoeud(machine)quihbergeunouplusieursserveurs

web

UnconteneurWeb Unserveurquihberge unconteneurWeb

ejb

UnconteneurEJB Unserveurquihberge unconteneurEJB

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

JOnAS EJB Container

JNDI

JOnAS EJB Container

DB