Hello all,

While working with some iPOJO components and mandatory references I stumbled 
upon the warning "The dependency is not optional, however no service can be 
injected", followed by an NPE.

The situation is fairly simple: I have a component A with a mandatory reference 
to service B. When service B goes away, it is first removed from my component 
A, but the @Invalidate callback of A is only called after the fact - 
effectively preventing me of doing a proper cleanup and provoking the NPE. This 
gets even more complicated when component A has started asynchronous jobs 
working with B, because it can't shut down those jobs on time.

I found a thread from 2009 on this list that treats more or less the same 
problem [1], Clement wrote as answer:

"When a required (not optional) service leaves, it invalidates the instance. If 
this instance has an 'invalidate' callback, this callback is called. The 
callback is called after its unregistration, that's why the service is no more 
available. So, invalidate callbacks must be developed defensively to check 
service availability."

I find this rather counter-intuitive. Why is the invalidate callback called 
after the fact? Yet, iPOJO has the information of the leaving mandatory 
reference B on time, since it can call the @Unbind callback on time. I am also 
comparing to Declarative Services, which guarantees that it will deactivate 
your component before it takes away any mandatory references. I found it a big 
advantage of iPOJO (compared to DS) to be able to drop the implementation of 
the bind/unbind glue and have the references injected in the fields directly. 
Now I do not only have write the glue again, moreover I have to delegate the 
unbind call to the invalidate() method for each mandatory reference in my 
component. 

The thing is that I do not see any advantage of iPOJO's call order compared to 
DS's call order. Are there specific reasons for this?

Regards,
Benjamin

[1] 
http://mail-archives.apache.org/mod_mbox/felix-users/200908.mbox/%[email protected]%3E

Reply via email to