[ https://issues.apache.org/jira/browse/FELIX-3661?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13454708#comment-13454708 ]
David Jencks commented on FELIX-3661: ------------------------------------- Well, we agree on how the components and services are related :-). Since A registers B from it's activate method, this is approximately equivalent to just A and C, with C having a reference to A (instead of B). This is a circular dependency that is not expected to work with DS. Just because you added some code to register some of the services doesn't make it any less circular :-) The spec can't enumerate all possible circular dependency situations, it just says that in general at best you will get all the components created and some of the references set up, but you shouldn't expect all the references to get set up. I'm fairly sure this is one of the situations that used to work when we were not spec compliant about registering immediate components before creating the implementation object, which is why you code worked with the old DS. Your code might work if you registered B in a different thread. (but returned immediately from the activate method. If you wait for the other thread you'll get a deadlock). Then the other thread wouldn't be able to get a read lock until the write lock is released after the component instance is set for A. This is roughly what I propose in FELIX-3557 > Scr sometimes does not invoke Reference bind method > --------------------------------------------------- > > Key: FELIX-3661 > URL: https://issues.apache.org/jira/browse/FELIX-3661 > Project: Felix > Issue Type: Bug > Components: Declarative Services (SCR) > Reporter: Pierre De Rop > Assignee: David Jencks > Attachments: msg2.log, msg.log > > > With scr from trunk: sometimes, a satisfied Reference bind method is not > invoked. > I'm not sure, but this might be related to the FELIX-3659 issue and/or when > Reference types are org.osgi.service.ComponentFactory types. > The use case is the following: > - I have a DS component (name="agent"), which depends on the CompositeFactory > service (ref is dynamic, optional, cardinality=0..N). > - the "agent" component is started (at this point), the CompositeFactory is > not yet available > - next, the implementation bundle for the CompositeFactory service starts and > registers the service, using bundleContext.registerService. > - but the "agent" component is not invoked in its > bindCompositeFactory(CompositeFactory) method. > I have attached a logfile which illustrates the problem. > 1) Line 8491: the '"agent" component is being created, and some bind method > are successfully invoked, except the "bindCompositeFactory" method (but this > is normal since the service is optional, and not yet available): > 2012-09-11 23:09:21,147 ProxyAppReporter-FastCacheListener DEBUG osgi - > [agent] For dependency loggerRepository, optional: false; to bind: > {[org.apache.log4j.spi.LoggerRepository]=org.apache.felix.scr.impl.manager.AbstractComponentManager$RefPair@1b7a875} > 2012-09-11 23:09:21,147 ProxyAppReporter-FastCacheListener DEBUG osgi - > [agent] invoking bind: bindLoggerRepository > 2012-09-11 23:09:21,147 ProxyAppReporter-FastCacheListener DEBUG osgi - > [agent] For dependency compositeFactory, optional: true; to bind: {} > (here the bind for loggerRepository is invoked, but not for compositeFactory > ... normal behavior for now. > 2) at line 8644, the CompositeFactory service is being registered, but we see > the "component not yet created, assuming bind method call succeeded" log and > the bindCompositeFactory method on the "agent" component is not invoked. > However, another > "com.alcatel_lucent.as.service.composite.impl.shell.FelixCompositeCommand" DS > component is succesfully bound with the CompositeFactory, but this component > depends on the CompositeService, using a ServiceReference type, instead of > the actual CompositeFactory type, in the bind method signature ... > 2012-09-11 23:09:21,222 ProxyAppReporter-FastCacheListener WARN > com.alcatel_lucent.as.service.composite.impl.CompositeFactoryImpl - > Registering CompositeFactory ... > 2012-09-11 23:09:21,222 ProxyAppReporter-FastCacheListener DEBUG osgi - > [agent] Dependency Manager: Adding Service > com.alcatel_lucent.as.service.composite.CompositeFactory/565 > 2012-09-11 23:09:21,222 ProxyAppReporter-FastCacheListener DEBUG osgi - > [agent] DependencyManager : component not yet created, assuming bind method > call succeeded > 2012-09-11 23:09:21,223 ProxyAppReporter-FastCacheListener DEBUG osgi - > [com.alcatel_lucent.as.service.composite.impl.shell.GogoCompositeCommand] > Dependency Manager: Adding Service > com.alcatel_lucent.as.service.composite.CompositeFactory/565 > 2012-09-11 23:09:21,223 ProxyAppReporter-FastCacheListener DEBUG osgi - > [com.alcatel_lucent.as.service.composite.impl.shell.GogoCompositeCommand] > DependencyManager : component not yet created, assuming bind method call > succeeded > 2012-09-11 23:09:21,223 ProxyAppReporter-FastCacheListener DEBUG osgi - > [com.alcatel_lucent.as.service.composite.impl.shell.FelixCompositeCommand] > Dependency Manager: Adding Service > com.alcatel_lucent.as.service.composite.CompositeFactory/565 > 2012-09-11 23:09:21,223 ProxyAppReporter-FastCacheListener DEBUG osgi - > [com.alcatel_lucent.as.service.composite.impl.shell.FelixCompositeCommand] > getting bind: bindCompositeFactory > 2012-09-11 23:09:21,224 ProxyAppReporter-FastCacheListener DEBUG osgi - > [com.alcatel_lucent.as.service.composite.impl.shell.FelixCompositeCommand] > Locating method bindCompositeFactory in class > com.alcatel_lucent.as.service.composite.impl.shell.FelixCompositeCommand > 2012-09-11 23:09:21,224 ProxyAppReporter-FastCacheListener DEBUG osgi - > [com.alcatel_lucent.as.service.composite.impl.shell.FelixCompositeCommand] > doFindMethod: Looking for method > com.alcatel_lucent.as.service.composite.impl.shell.FelixCompositeCommand.bindCompositeFactory > 2012-09-11 23:09:21,224 ProxyAppReporter-FastCacheListener DEBUG osgi - > [com.alcatel_lucent.as.service.composite.impl.shell.FelixCompositeCommand] > doFindMethod: Found Method public void > com.alcatel_lucent.as.service.composite.impl.shell.FelixCompositeCommand.bindCompositeFactory(org.osgi.framework.ServiceReference) > 2012-09-11 23:09:21,224 ProxyAppReporter-FastCacheListener DEBUG osgi - > [com.alcatel_lucent.as.service.composite.impl.shell.FelixCompositeCommand] > Found bind method: public void > com.alcatel_lucent.as.service.composite.impl.shell.FelixCompositeCommand.bindCompositeFactory(org.osgi.framework.ServiceReference) > 2012-09-11 23:09:21,224 ProxyAppReporter-FastCacheListener DEBUG osgi - > [com.alcatel_lucent.as.service.composite.impl.shell.FelixCompositeCommand] > invoking bind: bindCompositeFactory > 2012-09-11 23:09:21,224 ProxyAppReporter-FastCacheListener INFO > osgi.event.service - Service registered by bundle > com.alcatel_lucent.as.service.composite.impl(1.1100.01) > > {objectClass=[com.alcatel_lucent.as.service.composite.CompositeFactory],service.id=565} > Hope that the log file will be enough to understand the issue ? -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira