5.5.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 Cada vez que es preciso obtener referencias a interfaces Home (desde otros EJBs o desde un cliente) es preciso escribir código del estilo InitialContext initialContext = new InitialContext(); Object xxxHomeObject = initialContext.lookup(“java:comp/env/ejb/XXXHome”); XXXHome xxxHome = (XXXHome) PortableRemoteObject.narrow( xxxHomeObject, XXXHome.class); Service Locator (2) n Motivación (cont) n n Obtener una referencia a un interfaz Home es una operación costosa, especialmente cuando la capa cliente está en una máquina distinta a la del servidor de JNDI 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 n Las propiedades dependen del servidor de JNDI usado En MiniBank y MiniPortal se usó EJBHomeLocator EJBHomeLocator <<static>> - ejbHomes : Map <<static>> - initialContextProperties : Properties <<static>> - usesConfigurationFile : boolean - EJBHomeLocator() <<static>> + getEJBHome(jndiName : String, ejbHomeClass : Class) : EJBHome Service Locator (3) n Motivación (cont) n EJBHomeLocator usa el fichero EJBHomeLocatorJNDIInitialContext.properties para aislar las propiedades específicas al servidor de JNDI cuando es preciso usar el constructor InitialContext(Properties) n Ej.: java.naming.factory.initial=allaire.ejipt.ContextFactory java.naming.provider.url=ejipt://maquinaContedorEJBs:2323 n n EJBHomeLocator cachea las referencias a los interfaces Home Aplicabilidad n Cuando se necesita obtener referencias a interfaces Home (desde la capa cliente o desde la capa EJB) Service Locator (4) n Estructura ServiceLocator <<lookup, cache>> <<use>> Client n <<use>> <<interface>> EJBHome Participantes n ServiceLocator (EJBHomeLocator) n n Client n n Obtiene y cachea referencias a interfaces Home Un EJB (normalmente un Session Bean) o un Business Delegate EJBHome n El interface Home de un EJB (Session Bean o Entity Bean) Service Locator (5) 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 (6) n Implementación (cont) n La operación getEJBHome en EJBHomeLocator recibe el nombre JNDI del interfaz Home y el tipo del interfaz n n n Desde el Session Facade se usan los nombres JNDI especificados con ejb-ref en ejb-jar.xml (se han definido constantes) Desde el contenedor web, el Business Delegate también puede 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, el Business Delegate lee el nombre real usado por el servidor de JNDI de la configuración de la aplicación (web.xml o ConfigurationParameters.properties en una aplicación standalone) Service Locator (7) n Implementación (cont) n Core J2EE Patterns y EJB Design Patterns comentan distintas alternativas para no tener que pasar el nombre JNDI a la operación getEJBHomeLocator n n Aislar en un fichero de configuración el mapping entre nombres JNDI y tipos de los interfaces Home 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-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 EJB Service Locator (y 8) n Código de ejemplo n n es.udc.fbellas.j2ee.util.ejb.EJBHomeLocator Patrones relacionados n Factory