> On 28 Nov 2016, at 11:26, Nicolas Brasey <nicolas.bra...@gmail.com> wrote:
> 
> Hi Neil,
> 
> Thanks for the quick reply.
> 
> okay I see, I misinterpreted the specs then.
> 
> In my specific case, I need to make sure the static reference is there
> *before* the dynamic ones. What is the best patterns to ensure that ? Do I
> need to write synchonization code inside my component for that, or do you
> know a cleaner way with declarative services ?


The specs do not make that guarantee, so you need to write your code in such a 
way that it doesn’t matter what order the references are processed.

Typically this means deferring whatever action you take based on those 
references being bound. For example, both the static and the dynamic bind 
methods can call into a single “updateBindings” method, which checks whether 
everything is in place. That method will certainly need to be thread-safe, and 
synchronization is one way (though not the only way) to achieve that.

Regards,
Neil


> 
> Thanks!
> 
> Nicolas
> 
> 
> 
> 
> 
> 
> 
> 
> 
> On Mon, Nov 28, 2016 at 12:13 PM, Neil Bartlett <njbartl...@gmail.com>
> wrote:
> 
>> 
>>> On 28 Nov 2016, at 11:09, Nicolas Brasey <nicolas.bra...@gmail.com>
>> 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.
>> 
>> 
>> That is not required. Dynamic references can be bound, unbound or replaced
>> at any time… even potentially *while* the static references are being
>> bound, or while the activate is executing.
>> 
>> 
>>> 
>>> 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.
>> 
>> 
>> That’s correct.
>> 
>> 
>>> 
>>> 
>>> Does anyone have any idea what might be wrong ?
>> 
>> 
>> It doesn’t sound like anything is going wrong.
>> 
>> Regards,
>> Neil
>> 
>> 
>>> 
>>> 
>>> My env is Apache Karaf 4.0.5 with Felix SCR 2.0.2
>>> 
>>> 
>>> Thanks for you help!
>>> 
>>> Nicolas
>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscr...@felix.apache.org
>> For additional commands, e-mail: users-h...@felix.apache.org
>> 
>> 


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@felix.apache.org
For additional commands, e-mail: users-h...@felix.apache.org

Reply via email to