felix-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Bengt Rodehav <be...@rodehav.com>
Subject A couple of questions regarding iPojo interceptors
Date Thu, 20 Feb 2014 12:22:47 GMT
This is a follow up on another discussion I had with Clement on this
mailing list:

http://apache-felix.18485.x6.nabble.com/Using-iPojo-interceptors-tt5006168.html#a5006276

I'm now trying to get the interceptor solution into production.

Remember that I have to invalidate my instances when their configuration is
changed. This is because I need to re-evalutate the dependencies for the
instance.

Originally, I only called the invalidateSelectedServices() method on the
DependencyModel. This worked mostly but not when starting a fresh container
(I use Karaf and start it with "bin\karaf.bat clean"). My instance then
first becomes valid but then becomes invalid. I think this is because of
the ordering. The accept() method had not been called prior to
the getServiceReferences() method. The dependency is therefore not set to
"intercepted=true" which makes it invalid.

Replacing the call to  invalidateSelectedServices() with a call to
invalidateMatchingServices() seems to do the trick. However, there is one
small glitch that I would like to fix.

If I have a configuration that should not be valid (e g I specified an
extender id that is not present) the instance should never be valid. But,
when starting Karaf (both with "bin\karaf.bat" and "bin\karaf.bat clean"),
the instance becomes valid before it becomes invalid. It does end up in the
right state (invalid in this case) but for a short period of time it is
valid which will cause a lot of things to happen in my code that then must
be reversed when it becomes invalid.

I logged the sequence of events and it seems that the accept() method is
called first. I will then set "intercepted=true". This immediately makes
the instance valid. Shortly thereafter getServiceReferences() is called. I
will then re-calculate the dependency requirements and when I later
invalidate the dependencies the instance will become valid.

So, there is a short time frame where the instance is valid although it
shouldn't be. How can I fix that?

>From my point of view this is similar to a transaction. I do not want the
instance to become valid before I have done all my "intercepting" which is
after BOTH the accept() method AND the getServiceReferences() method have
been called.

BTW I also noted that the "dependencies" member in
the DefaultDependencyInterceptor class (I extend the
DefaultServiceRankingInterceptor class) seems to contain duplicates of my
dependency. The same DependencyModel instance occurs twice in the List.
Seems like a bug to me. Perhaps the List should be a Set?

/Bengt

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message