[
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