Me tropecé sobre un fenómeno en mi código, que se reduce a esto:
Tengo un servicio declarativa OSGi proporciona dos interfaces de servicios configurados de la siguiente manera:
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="dispose" enabled="true" name="redacted.redactedstore">
<implementation class="redacted.RedactedStore"/>
<service>
<provide interface="redacted.IRedactedStore"/>
<provide interface="redacted.IRedactedStoreControl"/>
</service>
</scr:component>
En mi código, tengo dos hilos diferentes, que tanto una apertura ServiceTracker
para obtener la instancia de servicio, pero a través de diferentes interfaces:
tracker = new ServiceTracker<>(getBundle().getBundleContext(), <serviceClass>.class, null);
tracker.open();
tracker.waitForService(1000l);
Así que uno usa hilo IRedactedStore
como clase de servicio y los otros usos IRedactedStoreControl
como interfaz de servicio.
Así que lo que parece ocurrir es que cuando ambos hilos se ejecutan en paralelo en el momento adecuado, el equinoccio SCR creará una instancia no es uno (lo que cabe esperar), pero dos instancias de la clase de implementación de componentes.
¿Es correcto este comportamiento? O se trata de un error en la implementación de Equinox OSGi?
Si el comportamiento es correcto, puedo hacer algo en mi código para evitar que mediante la configuración del servicio de otra manera? (Por supuesto que podría reestructurar el servicio por lo que sólo proporciona una interfaz, o podría sincronizar los rastreadores de servicios ...)
Para el componente no alcance prototipo que se puede esperar que se crea una sola vez. Ver especificaciones servicios declarativos .
Si este problema sólo ocurre cuando los seguidores de servicios se ejecutan en paralelo entonces sospecho que podría ser un problema de concurrencia en el equinoccio de SCR.