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)