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