[ 
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

Reply via email to