5.5.7 Service Locator

Anuncio
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
Descargar