> From: [email protected] > > I have been working with OSGi for a few months and recently started > learning about and implementing configuration management with with > declarative services. I have created a Component Factory following the
The term Component Factory means something else in the DS spec. I think you mean Factory Configurations (see 112.7 in the spec). > Multiton method following the example at > http://wiki.osgi.org/wiki/Declarative_Services. > > Using Apache Web Console I have confirmed that when I create a new > component with String instancePid = > configAdmin.createFactoryConfiguration(factoryPid, null) the new instance > shows up in the console and is registered under the appropriate interface. > > I have a ServiceListener listening for service registration. Below is and Why are you implementing ServiceListener if you are using DS? The main value of DS is completely avoiding using the raw service API. To use one of the services, just have your component reference the service. See 112.3 in the spec and the @Reference annotation. > example of the serviceChanged method I have implemented. I get the > component ServiceReference but when I try to get the interface from > BundleContext it is always null. > > public void serviceChanged(ServiceEvent event) > { > ServiceReference ref = event.getServiceReference(); > Object sid = ref.getProperty(Constants.SERVICE_PID); > if(sid != null && sid instanceof String && ( (String)sid > ).equals(instancePid ) ) > { > if(event.getType() == ServiceEvent.REGISTERED) > { > MyInterface interface = > (MyInterface)bundleContext.getService(ref); > >>>> I make it here but interface is always null. Have you checked the LogService for possible logged exceptions activating the components? DS will use a ServiceFactory to register the service and then instantiate the component instance to return a service object. If there is an exception doing this, null will be returned. > } > } > } > > As an alternate approach I tried utilizing a service tracker for > MyInterface and addService calls are received, but the incoming interface > is again always null. > > I confirmed that the bundle (where I am get the bundle context from) is > ACTIVE. I checked ServiceReference.isAssignableTo on my bundle and > MyInterface.class.getName() and it returns true. > > I have dealt with singleton services and never had a problem getting > MyInterface using the above approach. Is there something different about > how components from a component factory get registered using DS? > > I use the equinox implementation of ogsi, DS, and CM with BND. > > I suspect that I'm missing something fundamental, or got my wires crossed > on utilizing factories versus services, but I can't quite see where the > problem is. Any guidance is appreciated. -- BJ Hargrave Senior Technical Staff Member, IBM OSGi Fellow and CTO of the OSGi Alliance [email protected] office: +1 386 848 1781 mobile: +1 386 848 3788
_______________________________________________ OSGi Developer Mail List [email protected] https://mail.osgi.org/mailman/listinfo/osgi-dev
