Hey,

 Maybe I should start making a new thread for this hehe :). Not sure if this is 
a bug or if I'm just using it incorrectly.

So created some test classes quickly. 
Don't know when it used to work with the immediate = true, but I guess it might 
not be related then, seeing as it wont work for field even with immediate true. 
I tried the following two examples. The one with the bind method does work, the 
one with field reference does not.

# Field reference:

@Component(service = TestAggregator.class)
public class TestAggregator {

    @Reference(policy = ReferencePolicy.DYNAMIC, cardinality = 
ReferenceCardinality.MULTIPLE)
    private List<TestInterface> interfaces = new 
CopyOnWriteArrayList<TestInterface>();

}

generates following xml:

<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.3.0"; 
name="org.apache.felix.osgi.ds.TestAggregator">
    <implementation class="org.apache.felix.osgi.ds.TestAggregator"/>
    <service>
        <provide interface="org.apache.felix.osgi.ds.TestAggregator"/>
    </service>
    <reference name="interfaces" cardinality="0..n" policy="dynamic" 
interface="org.apache.felix.osgi.ds.TestInterface" field="interfaces" 
field-collection-type="service"/>
</scr:component>

# Method reference: 

@Component(service = TestAggregator.class)
public class TestAggregator {

    @Reference(policy = ReferencePolicy.DYNAMIC, cardinality = 
ReferenceCardinality.MULTIPLE)
    protected void bindTestInterface(TestInterface testInterface) {
        interfaces.add(testInterface);
    }

    protected void unbindTestInterface(TestInterface testInterface) {
        interfaces.remove(testInterface);
    }
}

generates following xml:

<?xml version="1.0" encoding="UTF-8"?>
<component name="org.apache.felix.osgi.ds.TestAggregator">
    <implementation class="org.apache.felix.osgi.ds.TestAggregator"/>
    <service>
        <provide interface="org.apache.felix.osgi.ds.TestAggregator"/>
    </service>
    <reference name="TestInterface" cardinality="0..n" policy="dynamic"
               interface="org.apache.felix.osgi.ds.TestInterface" 
bind="bindTestInterface"
               unbind="unbindTestInterface"/>
</component>

The field reference one won't bind an existing TestInterface service, the 
method reference will.

Greets,
Roy


> On 29 Nov 2016, at 00:28, David Jencks <[email protected]> wrote:
> 
> As everyone has said, the immediate setting isn’t going to make any 
> difference to the binding.  You may be able to investigate what is going on 
> by installing gogo and looking at the output of scr:info in various 
> circumstances and also by installing an osgi logger and setting the 
> ds.loglevel=debug framework or ds configuration property and examining the 
> resulting voluminous log output.
> 
> For the @Reference-on-field question could you show the component xml 
> generated by bnd (perhaps via the maven-bundle-plugin)?  Which version of bnd 
> is in use?  Some older versions didn’t figure out the service type very well, 
> and I’m not sure anyone has tested with the <> “diamond” notation (although I 
> can’t imagine how this could mess anything up).
> 
> thanks
> david jencks
> 
>> On Nov 28, 2016, at 12:33 PM, Roy Teeuwen <[email protected]> wrote:
>> 
>> Hey Karel,
>> 
>> Sorry to go further than the original question, but seeing as my question is 
>> related to exactly the same thing, maybe you can help me understand it 
>> better. 
>> Using the exact same example as the in the initial post, if I don't put 
>> immediate=true, it won't bind all of the services get created at startup or 
>> get added during the runtime. Is there a reason why it has to be immediate = 
>> true?
>> 
>> I also tried it by using the following notation, and then this it doesn't 
>> even bind any of services:
>> 
>> @Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = 
>> ReferencePolicy.DYNAMIC)
>> private List<StateMachine> stateMachines = new CopyOnWriteArrayList<>();
>> 
>> Greetings,
>> Roy
>>> On 28 Nov 2016, at 21:39, Karel Haeck <[email protected]> wrote:
>>> 
>>> Nicolas,
>>> 
>>> the spec does not specify that static references should be injected before 
>>> dynamic,
>>> but it does specify that references must be processed in sequence as 
>>> specified in the component xml:
>>> 
>>> "When binding services, the references are processed in the order in which 
>>> they are specified in the
>>> component description. That is, target services from the first specified 
>>> reference are bound before
>>> services from the next specified reference."
>>> 
>>> In addition the spec specifies how @Reference annotations are ordered:
>>> 
>>> " In the generated Component Description for a component, the references 
>>> must be ordered in ascending
>>> lexicographical order (using String.compareTo ) of the reference names."
>>> 
>>> Note that the default name is based on the field or method name. In your 
>>> case get aclService  for the static reference
>>> and "" (empty string) for the dynamic reference as spec states that the add 
>>> , bind or set prefix is removed.
>>> ( Actually if one uses Java naming conventions the event methods will have 
>>> names starting with an upper case character and precede the field 
>>> references).
>>> 
>>> By specifying e.g.  @Reference( name = "zStateMachine", cardinality = 
>>> ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC)
>>> the static reference should be bound first.
>>> 
>>> Note that there is still a potential race condition between the add and an 
>>> activate method if present,
>>> or between two concurrent add() executions.
>>> 
>>> regards,
>>> Karel
>>> 
>>> On 28/11/2016 12:09, Nicolas Brasey wrote:
>>>> Hi,
>>>> 
>>>> I have a bind order issue with a component that has :
>>>> 
>>>> 1) A static reference specified with annotation @Reference on the private
>>>> field
>>>> 2) A dynamic multiple reference specificed with annotation on a method
>>>> 
>>>> The static reference is not bound before the dynamic ones.
>>>> 
>>>> The code looks like this:
>>>> 
>>>> @Component(immediate = true)
>>>> public class MyServiceImpl implements MyService {
>>>> 
>>>>   @Reference
>>>>   private AclService aclService;
>>>> 
>>>>   @Reference(
>>>>           cardinality = ReferenceCardinality.MULTIPLE,
>>>>           policy = ReferencePolicy.DYNAMIC
>>>>   )
>>>>   public void add(StateMachine stateMachine) {
>>>>      ....
>>>>       ....
>>>>   }
>>>> 
>>>> 
>>>> According to the Declarative Service specifications, the static references
>>>> should always be injected before the activate method.
>>>> 
>>>> 
>>>> Does anyone have any idea what might be wrong ?
>>>> 
>>>> 
>>>> My env is Apache Karaf 4.0.5 with Felix SCR 2.0.2
>>>> 
>>>> 
>>>> Thanks for you help!
>>>> 
>>>> Nicolas
>>>> 
>>> 
>>> 
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: [email protected]
>>> For additional commands, e-mail: [email protected]
>>> 
>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [email protected]
>> For additional commands, e-mail: [email protected]
>> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to