Deberías estar familiarizado con el modelo de eventos usado por el JNDI antes de leer esta
sección. El modelo de eventos se cubre en la lección
Notificación de Eventos.
Normalmente un proveedor de servicio soporta notificación de enventos cuando el servicio de
nombres/directorio proporciona dicha característica. Sin embargo, un proveedor de servicio
podría soportar notificación de eventos incluso si el servicio subyacente no lo hace.
Simplemente necesita hacer más trabajo y quizás ofrecer la característica obligando a cambiar
el servicio subyacente.
Introducción de la Arquitectura
La notificación de eventos se puede implementar de varias formas diferentes. Abajo tenemos una
arquitectura de ejemplo. Sin embargo, que una funcione con nuestro proveedor de servicio
dependerá de las características del servicio de nombres/directorio subyacente.
Para añadir soporte de notificación de eventos, necesitamos estos tres componentes:
Bookkeeper.
Mantiene la lista de oyentes y es responsable de implementar los métodos de registro/desregistro
de los interfaces EventContext y EventDirContext.
Notifier.
Notifica un evento al oyente(s). Normalmente la ocurrencia de un evento la dispara un cambio
asíncrono en el servicio subyacente. El notificador detecta el cambio (por ejemplo, mediante un
mensaje del servicio subyacente o mediante la obtención de su estado) y pone un evento
correspondiente en la cola de eventos.
Cola de Eventos.
Mantiene una cola de eventos que han ocurrido y dispara eventos a los oyentes registrados.
Para implementar la notificación de eventos, nuestra implementación de contexto debe implementar
los interfaes EventContext o
EventDirContext. El bookkeeper podría ser
una parte de la implementación de contexto o una utilidad usada por esta implementación. Cuando
un programa registra un oyente, el bookkeeper graba el oyente y el
objetivo en el que está interesado. Luego usa--crea o usa un thread de un almacen de threads--
un notifier para seguir el objetivo. Normalmente, el
notifier es un thread que escucha los cambios del objetivo. Cuando el
notifier detecta un cambio que lanzará un evento, crea un evento que
contiene la imformación apropiada y lo pone en la cola de eventos. El
notifier vuelve a escuchar los futuros cambios. La cola de
eventos es monitorizada por un thread manejador de cola de eventos, cuyo trabajo es
eliminar un evento de la cola y despacharlo a los oyentes apropiados.
Trucos de Implementación
Aquí hay algunos trucos que debemos tener en mente cuando desarrollemos nuestra implementación
de contexto:
Manejar el Registro de Oyentes.
El registro de oyentes está asociado con un ejemplar Context no
con la represetnación del contexto en el servicio subyacente. Por ejemplo, supongamos que
estámos usando un servicio LDAP. No podemos esperar registrar un oyente con uno de los
ejemplares Context y eliminarlo de otro ejemplar
Context, incluso si ámbos representan la misma entrada LDAP. Por
lo tanto nuestra implementación debería mantener listas de oyentes separadas para ejemplares de
Context diferentes.
Cuándo Des-registrar.
Algunos eventos causan un des-registro automático. Si un oyente recibe una excepción o si se
cierra el ejemplar Context con el que se han registrado, el
oyente es des-registrado automáticamente y no recbirá más eventos. Nuestra implementación del
notifier debería prestar atención a los eventos de excepción que genera
y decirle al bookkeeper que des-registre a los oyentes que reciben dichas
excepciones (sólo después de que hayan sido enviados los eventos de
excepción).
Usar threads.
Sin importar si nuestra elección sigue el ejemplo de arquitectura descrito en páginas
anteriores, el soporte de notificación de eventos requiere el uso de threads. Además, estos
threads manipulan datos compartidos como ejemplares de Context,
colas de eventos y listas de oyentes. Debemos asegurarnos de tener un buen conocimiento del
modelo de Threads en el lenguaje Java.