2010-02-05 4 views
5

Estoy tratando de entender qué garantías se proporcionan para los eventos del servicio.¿Qué garantías de pedido se proporcionan en las llamadas de ServiceListener y ServiceTracker?

La especificación OSGi dice que los ServiceEvents son síncronos, he deducido que un ServiceListener no recibirá una llamada serviceChanged() con UNREGISTERING ServiceEvent hasta que se complete la llamada serviceChanged() con un evento de servicio REGISTRADO. ¿Es esto correcto?

También he echado un vistazo a la fuente de ServiceTracker. Parece tratar de hacer frente a la situación en la que esas dos llamadas serviceChanged() se superponen. es posible?

¿Existen garantías similares en las llamadas a un ServiceTrackerCustomizer?

Respuesta

1

Este es un problema muy complicado. Cuando se registra un servicio en OSGi, se maneja el evento y se notifica a todas las partes interesadas (oyentes de servicio, rastreadores de servicio y tiempo de ejecución del servicio declarativo). Cada parte interesada tiene la oportunidad de manejar el evento. El manejo del evento puede incluir el registro o anulación del registro de servicios adicionales. Debido al comportamiento sincrónico de la notificación ServiceEvent, estos eventos se envían a las partes interesadas. En una larga cadena de dependencias terminas con un árbol de notificación, donde vas a registrar un solo servicio y provoca que un montón de muchachos nuevos se registren. Lo sé porque puede hacer que el ajuste del rendimiento del inicio de OSGi sea un ejercicio muy desafiante, ya que su simple llamada al servicio de registro se cobró por la activación del servicio de un número desconocido de servicios.

Para responder específicamente a su pregunta, no es una preocupación de múltiples subprocesos con los eventos, es un reentrante. Ese es el tipo que procesa su evento de registro podría volver a comunicarse con usted con otra notificación de evento antes de que se procese el árbol completo. Esta es una de las razones por las que recomiendan encarecidamente que nunca registre ni anule el registro de servicios mientras mantiene bloqueos, de lo contrario, puede interbloquear el hilo del despachador de eventos. Otra buena forma de mantenerse a salvo es tener un árbol de dependencia del paquete, no un gráfico. Las dependencias circulares entre paquetes, incluso si las clases se compilan, pueden causar problemas reales.

Espero que esto ayude. Si desea leer más sobre este tipo de cosas, hay un nuevo libro que sale en OSGi y Equinox. Está disponible en cortes ásperos ahora y debería estar disponible en impresión muy pronto. http://my.safaribooksonline.com/9780321561510

+0

Para evitar estas tormentas de eventos durante el inicio y para mantener un poco de orden, puede usar los niveles de inicio. – akr

+1

Si el servicio A está registrado, cada ServiceListener interesado recibirá una llamada serviceChanged() con un evento REGISTRADO para ese servicio. ¿Es posible recibir una llamada de reingreso serviceChanged() con un evento UNREGISTERING para ese * mismo servicio A * mientras se está procesando el evento REGISTRADO? No puedo ver que sea posible, ya que necesita un ServiceRegistration para anular el registro del servicio y que no estará disponible hasta que se complete el registro, pero ... –

Cuestiones relacionadas