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

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

Neil Bartlett created FELIX-5769:
------------------------------------

             Summary: 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


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
(v6.4.14#64029)