[ https://issues.apache.org/jira/browse/FELIX-3661?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13454693#comment-13454693 ]
Pierre De Rop commented on FELIX-3661: -------------------------------------- No, as far as I know, I don't have such circular dependency. However, I will take time to extensively verify your assumption. I will let you know. But in the meantime, I have made a quick test which seems to reproduce the usecase I was talking about in my previous post: I made this: @Component public class A { @Reference(type='*') /* optional, cardinality=0..N, dynamic */ void bindC(C c) { System.out.println("A.bindC"); } @Activate void start(BundleContext ctx) { System.out.println("A.start: registering B"); ctx.registerService(B.class.getName(), new B(), null); } } public class B { } @Component(provide={C.class}) // delayed component ... public class C { @Reference void bindB(B b) { System.out.println("C.bindB"); } @Activate void start() { System.out.println("C.start"); } } Here, we have: - A depends on C (optional/dynamic) - C depends on B, and provides itself, (delayed component) - A registers B from its activate and this should enable C (C is a delayed component, but since A has a Ref(dynamic,optional,cardinality=0..N) on C, then C should be activated. I don't think we have a circular dependency here, because C does not depend on A. But with this test, C is never activated, and A is thus never bound to C, and I see the log: DEBUG: test.scr (11): [test.scr.A] Dependency Manager: Adding Service test.scr.C/36 DEBUG: test.scr (11): [test.scr.A] DependencyManager : component not yet created, assuming bind method call succeeded Now, what is interesting is that if I change the definition of C to be immediate, then everything is working file: @Component(immediate=true, provide={C.class}) public class C { @Reference void bindB(B b) { System.out.println("C.bindB"); } @Activate void start() { System.out.println("C.start"); } } -> A is created (and registers B from its activate) -> C is created -> A is injected with B But I think that it should also work with C being a delayed component, because A defines an optional dependency on C ... Am I making sense ? > 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