Download 5.6.7 Service Locator
Document related concepts
no text concepts found
Transcript
5.6.7 Service Locator Service Locator (1) n Intención n n También conocido como n n Disponer de un mecanismo genérico que permita obtener y cachear referencias a interfaces Home EJBHomeFactory Motivación n En MiniBank, cada vez que AccountFacadeEJB tiene que obtener referencias a interfaces Home locales sería preciso escribir código del estilo InitialContext initialContext = new InitialContext(); AccountLocalHome accountLocalHome = (AccountLocalHome) initialContext.lookup(“java:comp/env/ejb/AccountLocalHome”); Service Locator (2) n Motivación (cont) n En MiniBank, cada vez que EJBAccountFacadeDelegate tiene que obtener una referencia al interfaz remoto AccountFacadeHome sería preciso escribir código del estilo InitialContext initialContext = new InitialContext(); Object accountFacadeHomeObject = initialContext.lookup(“java:comp/env/ejb/AccountFacadeHome”); AccountFacadeHome accountFacadeHome = (AccountFacadeHome) PortableRemoteObject.narrow( accountFacadeHomeObject, AccountFacadeHome.class); n Las referencias a cualquier interfaz Home, según sea local o remoto, se obtienen de manera similar Service Locator (3) n Motivación (cont) n n Obtener una referencia a un interfaz Home tiene cierto coste computacional asociado, especialmente cuando el servicio de nombres está en otra máquina (ej.: la obtención de referencias a AccountFacadeHome que causan los EJBAccountFacadeDelegate) Cuando la capa cliente es una aplicación standalone o un servidor de aplicaciones web en el que no se puede hacer uso de ejb-ref en web.xml, el contexto inicial ha de crearse con el constructor InitialContext(Properties) n Las propiedades dependen del servidor de nombres usado Service Locator (4) n Motivación (cont) n El subsistema Util de J2EE-Examples proporciona EJBLocalHomeLocator y EJBHomeLocator EJBLocalHomeLocator <<static>> - ejbLocalHomes : Map - EJBLocalHomeLocator() <<static>> + getEJBLocalHome(jndiName : String) : EJBLocalHome EJBHomeLocator <<static>> - ejbHomes : Map <<static>> - initialContextProperties : Properties <<static>> - usesConfigurationFile : boolean - EJBHomeLocator() <<static>> + getEJBHome(jndiName : String, ejbHomeClass : Class) : EJBHome Service Locator (5) n Motivación (cont) n EJBHomeLocator usa el fichero EJBHomeLocatorJNDIInitialContext.properties para aislar las propiedades específicas al servidor de nombres cuando es preciso usar el constructor InitialContext(Properties) n Ej.: java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.provider.url=localhost:1099 java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces n n EJBLocalHomeLocator y EJBHomeLocator cachean las referencias a los interfaces Home (especialmente importante en el caso de EJBHomeLocator) Aplicabilidad n Cuando se necesita obtener referencias a interfaces Home Service Locator (6) n Estructura ServiceLocator <<lookup, cache>> <<use>> Client n <<use>> <<interface>> EJBHome Participantes n ServiceLocator (EJBLocalHomeLocator y EJBHomeLocator) n n Client (AccountFacadeEJB y EJBAccountFacadeDelegate) n n Obtiene y cachea referencias a interfaces Home Un EJB (normalmente un Session Bean) o un Business Delegate EJBHome n El interfaz Home de un EJB (Session Bean o Entity Bean) Service Locator (7) n Colaboraciones n n Un Service Locator obtiene y cachea referencias a interfaces Home Consecuencias n Beneficios n n n n Abstrae la manera de obtener referencias a interfaces Home Evita replicar código de obtención de referencias a interfaces Home La caché mejora la eficiencia Implementación n Qué ocurre si el servidor de EJB se cae y vuelve a arrancar ? n En la mayor parte de las implementaciones de EJB, las referencias cacheadas en el Service Locator del cliente no se invalidan porque los stubs contemplan este caso Service Locator (8) n Implementación (cont) n getEJBLocalHome y getEJBHome reciben el nombre JNDI del interfaz Home n n n Desde los Session Facades se usan los nombres JNDI especificados con ejb-local-ref en ejb-jar.xml (se han definido constantes) Desde el contenedor web, los Business Delegates también pueden usar los nombres declarados con ejb-ref en web.xml, siempre que el contenedor web esté integrado con el servidor de EJBs (se pueden definir constantes) Si no lo está (la asunción que se ha hecho en MiniBank y MiniPortal) o el cliente es una aplicación standalone, los Business Delegates leen los nombres reales usados por el servidor de nombres de la configuración de la aplicación (web.xml en una aplicación web o ConfigurationParameters.properties en una aplicación standalone) Service Locator (9) n Implementación (cont) n Core J2EE Patterns y EJB Design Patterns comentan distintas alternativas para no tener que pasar el nombre JNDI en getEJBLocalHome y getEJBHome n Usar el nombre de la clase Home (ej.: es.udc.fbellas.j2ee.minibank.model.accountfacade .ejb.AccountFacadeHome) como nombre JNDI n n n Basta especificar estos nombres con ejb-local-ref o ejb-ref en ejb-jar.xml y web.xml No es válido para clientes standalone No es válido cuando el contenedor web no está integrado con el servidor de EJBs Service Locator (y 10) n Código de ejemplo n n n es.udc.fbellas.j2ee.util.ejb.EJBHomeLocator es.udc.fbellas.j2ee.util.ejb.EJBLocalHomeLocator Patrones relacionados n Factory