Roy,

the immediate setting should not have any impact on the reference binding proces.
 Are you sure that your component is activated at some time ?

 Karel

On 28/11/2016 21:42, Roy Teeuwen wrote:
Hey David,

True, I know thats what the immediate=true will do.
What I don't understand is that when you don't use the immediate=true and my 
service does get lazily loaded when it is finally needed, that it doesn't load 
all it's references that are dynamic and multiple.
Seeing as I have been taught to try and avoid the immediate=true when it isn't 
absolutely necessary, I am trying to see if there are possibilities to remove 
it and still get all the dynamic references.

Greets,
Roy
On 28 Nov 2016, at 22:37, David Daniel <[email protected]> wrote:

I believe the immediate true separates the lifecycle from the resolution
phase and is similar to starting a singleton.  If there is no immediate
true then the lifecylce is based on when the service is a dependency and
lazily loaded.  If another service depends on your service and is started
then your service will be started as well but when the other service
shutsdown and your service is not longer needed then your service will
shutdown as well without the immediate = true.

On Mon, Nov 28, 2016 at 3: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