osgi: à l'Aide de ServiceFactories?

Je suis en train d'essayer d'obtenir un simple paquet contenant un Service à l'Usine en cours d'exécution.

C'est ma classe factory:

public class SvcFactory implements ServiceFactory<ServiceB> {

    @Override
    public ServiceB getService(Bundle bundle,
            ServiceRegistration<ServiceB> registration) {

        return new ServiceBImpl();
    }

    @Override
    public void ungetService(Bundle bundle, ServiceRegistration<ServiceB> registration,
            ServiceB service) {

    }

}

C'est mon service qui doit être créé par l'usine de:

public class ServiceBImpl implements ServiceB {

    private ServiceA svcA;

    public void setA(ServiceA a) {
        svcA = a;
    }

}

Et enfin la OSGI-INF/component.xml

<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="bundleb.internal.SvcFactory">

   <implementation class="bundleb.internal.SvcFactory"/>

  <reference bind="setA" cardinality="1..1" interface="bundlea.ServiceA" name="ServiceA" policy="static"/>

   <service servicefactory="true">
      <provide interface="bundleb.ServiceB"/>
   </service>
</scr:component>

Si je lance mon test de faisceaux (A, B et C) au sein de l'équinoxe j'obtiens l'erreur suivante:

org.osgi.framework.ServiceException: org.eclipse.equinox.internal.ds.FactoryReg.getService() returned a service object that is not an instance of the service class bundleb.ServiceB

Je ne trouve pas beaucoup d'informations sur l'utilisation ServiceFeactories déclaré dans un composant définition sur internet. Même le livre "OSGi et Équinoxe" ne m'a pas dit beaucoup sur leur utilisation.
Quelqu'un pourrait-il m'expliquer ce que je fais mal?

  • le bundle contient votre service ne devrait pas avoir le ServiceB.class fichier. Si elle, elle serait d'utiliser différents ServiceB pour les différents bundle -- c'est faux.
  • Je pense que vous avez mal compris. Si vous spécifiez le servicefactory attribut, puis DS va créer une nouvelle instance pour chaque module. Vous pouvez obtenir le paquet que vous ont été attribués à partir du ComponentContext.