You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Carsten Ziegeler (JIRA)" <ji...@apache.org> on 2018/04/30 08:14:00 UTC

[jira] [Closed] (FELIX-5769) SCR should not bind prototype_required reference to bundle scope service

     [ https://issues.apache.org/jira/browse/FELIX-5769?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Carsten Ziegeler closed FELIX-5769.
-----------------------------------

> SCR should not bind prototype_required reference to bundle scope service
> ------------------------------------------------------------------------
>
>                 Key: FELIX-5769
>                 URL: https://issues.apache.org/jira/browse/FELIX-5769
>             Project: Felix
>          Issue Type: Bug
>          Components: Declarative Services (SCR)
>    Affects Versions: scr-2.0.14
>            Reporter: Neil Bartlett
>            Assignee: Carsten Ziegeler
>            Priority: Major
>             Fix For: scr-2.1.0
>
>         Attachments: scr-debug.log
>
>
> I have a consumer component that refers to a service using prototype_required service scope:
> {code:java}
> @Component
> public class ConsumerComponent {
>     @Reference(scope = ReferenceScope.PROTOTYPE_REQUIRED)
>     Runnable runnable;
> }
> {code}
> And another component that provides the correct service type BUT uses bundle scope:
> {code:java}
> @Component(scope = ServiceScope.BUNDLE)
> public class ProviderComponent implements Runnable {
>     @Override
>     public void run() {}
> }
> {code}
> According to the OSGi R6 Compendium spec, section 112.3.5, the reference should not bind to the service because "for a bound service of a reference with prototype required reference scope, only services registered with prototype service scope can be considered as target services ... A service that does not use prototype service scope cannot be used as a bound service for a reference with prototype required reference scope since the service cannot provide a distinct service object for each component instance".
> However in SCR 2.0.14, the consumer component is in fact bound to the service as shown below.
> I have used factory config to create three instances of the consumer component. All three are satisfied and active:
> {noformat}
>  [   7]   com.effectiveosgi.ConsumerComponent  enabled
>     [   5] [active      ] com.effectiveosgi.ConsumerComponent.f89094ca-85d6-4f22-ae73-198e6977ba8e (com.effectiveosgi.ConsumerComponent )
>     [   6] [active      ] com.effectiveosgi.ConsumerComponent.e2cb08d0-4b4d-48c8-b6cc-248bc1bfdc92 (com.effectiveosgi.ConsumerComponent )
>     [   7] [active      ] com.effectiveosgi.ConsumerComponent.9b7e9c7e-be11-442e-b9c7-2c6e9ea70544 (com.effectiveosgi.ConsumerComponent )
> {noformat}
> The scr:info command shows that all three component instances are bound to the same service, and that is is bundle scope:
> {noformat}
> g! scr:info com.effectiveosgi.ConsumerComponent
> *** Bundle: example (7)
> Component Description:
>   Name: com.effectiveosgi.ConsumerComponent
>   Implementation Class: com.effectiveosgi.ConsumerComponent
>   Default State: enabled
>   Activation: immediate
>   Configuration Policy: optional
>   Activate Method: activate
>   Deactivate Method: deactivate
>   Modified Method: -
>   Configuration Pid: [com.effectiveosgi.ConsumerComponent]
>   Reference: runnable
>     Interface Name: java.lang.Runnable
>     Cardinality: 1..1
>     Policy: static
>     Policy option: reluctant
>     Reference Scope: prototype_required
>   Component Description Properties:
>   Component Configuration:
>     ComponentId: 5
>     State: active      
>     SatisfiedReference: runnable
>       Target: null
>       Bound to:        35
>       Reference Properties:
>           component.id = 8
>           component.name = com.effectiveosgi.ProviderComponent
>           objectClass = [java.lang.Runnable]
>           service.bundleid = 7
>           service.id = 35
>           service.scope = bundle
>     Component Configuration Properties:
>         _com.effectiveosgi.rt.config.filePath = /Users/neil.bartlett/Projects/eosgi-runtime/_assembly/load/http-config.yaml
>         _com.effectiveosgi.rt.config.identity = tertiary
>         component.id = 5
>         component.name = com.effectiveosgi.ConsumerComponent
>         org.osgi.service.http.port = 8081
>         service.factoryPid = com.effectiveosgi.ConsumerComponent
>         service.pid = com.effectiveosgi.ConsumerComponent.f89094ca-85d6-4f22-ae73-198e6977ba8e
>   Component Configuration:
>     ComponentId: 6
>     State: active      
>     SatisfiedReference: runnable
>       Target: null
>       Bound to:        35
>       Reference Properties:
>           component.id = 8
>           component.name = com.effectiveosgi.ProviderComponent
>           objectClass = [java.lang.Runnable]
>           service.bundleid = 7
>           service.id = 35
>           service.scope = bundle
>     Component Configuration Properties:
>         _com.effectiveosgi.rt.config.filePath = /Users/neil.bartlett/Projects/eosgi-runtime/_assembly/load/http-config.yaml
>         _com.effectiveosgi.rt.config.identity = secondary
>         component.id = 6
>         component.name = com.effectiveosgi.ConsumerComponent
>         org.osgi.service.http.port = 8081
>         service.factoryPid = com.effectiveosgi.ConsumerComponent
>         service.pid = com.effectiveosgi.ConsumerComponent.e2cb08d0-4b4d-48c8-b6cc-248bc1bfdc92
>   Component Configuration:
>     ComponentId: 7
>     State: active      
>     SatisfiedReference: runnable
>       Target: null
>       Bound to:        35
>       Reference Properties:
>           component.id = 8
>           component.name = com.effectiveosgi.ProviderComponent
>           objectClass = [java.lang.Runnable]
>           service.bundleid = 7
>           service.id = 35
>           service.scope = bundle
>     Component Configuration Properties:
>         _com.effectiveosgi.rt.config.filePath = /Users/neil.bartlett/Projects/eosgi-runtime/_assembly/load/http-config.yaml
>         _com.effectiveosgi.rt.config.identity = primary
>         component.id = 7
>         component.name = com.effectiveosgi.ConsumerComponent
>         org.osgi.service.http.port = 8080
>         service.factoryPid = com.effectiveosgi.ConsumerComponent
>         service.pid = com.effectiveosgi.ConsumerComponent.9b7e9c7e-be11-442e-b9c7-2c6e9ea70544
> {noformat}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)