You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@karaf.apache.org by Ed Welch <ed...@edjusted.com> on 2015/01/02 15:39:44 UTC
Blueprint service behavior,
I've encountered a scenario which I'm hoping someone can help me understand better, and see if there is a problem or some kind of workaround I can implement.
Lets say I have 3 bundles A,B,C
A uses a service provided by B, B uses a service provided by C:
A <- B <- C
My application is initiated by a JMS message received by bundle A, which calls the service exported by B, which calls the service exported by C.
This all works perfectly, until.....
I am using the Karaf bundle:watch feature (which is fantastic) and I re-build bundle B.
Karaf sees the change and does an update on bundle B.
When the next JMS message comes into A, it calls the service exported by B
And i've seen two distinct failures, and I haven't really been able to pin down how to uniquely replicate each.
When A tries to call B, I sometimes get:
getService() returned null for [interface exported by B]
but also, more strangely, sometimes the call from A->B works, and when B->C is called I get:
An Unexpected Error Occurred: org.osgi.service.blueprint.container.ServiceUnavailableException: The Blueprint container is being or has been destroyed: [interface exported by C, which is consumed by B]
I was under the impression that the Blueprint service proxies would handle this kind of bundle update for me, but no matter how many times i've tried this, the only way i can get it to successfully work after bundle B is updated, is to refresh bundle A.
I'm running Karaf 3.0.2 (with a patched org.apache.karaf.bundle.core jar file provided by Jean-Baptiste from this thread: http://karaf.922171.n3.nabble.com/karaf-3-0-2-bundle-watch-not-working-td4035923.html which makes the watch feature work in 3.0.2)
On Java 8 update 25 (32bit), Windows 7
I'm really looking for two things, someone confirming this behavior is expected, and not an issue.
And if this is the expected behavior, is there a way I can automatically trigger the refresh of bundle A when bundle B is updated by bundle:watch?
Thanks!
Ed Welch
Re: Blueprint service behavior,
Posted by Charlie Mordant <cm...@gmail.com>.
Hi,
I think this is an expected behaviour, let me try to explain why:
While referencing your service, you're referencing one instance of it: the
consumer will not see a disapearance/update of it.
So you'll call the old service reference from A to B every time you'll call
it.
A workaround is to make a reference-listener instead of a direct reference,
so that unbind then bind hooks will be called.
Regards,
2015-01-02 15:39 GMT+01:00 Ed Welch <ed...@edjusted.com>:
> I've encountered a scenario which I'm hoping someone can help me
> understand better, and see if there is a problem or some kind of workaround
> I can implement.
>
> Lets say I have 3 bundles A,B,C
>
> A uses a service provided by B, B uses a service provided by C:
>
> A <- B <- C
>
> My application is initiated by a JMS message received by bundle A, which
> calls the service exported by B, which calls the service exported by C.
>
> This all works perfectly, until.....
>
> I am using the Karaf bundle:watch feature (which is fantastic) and I
> re-build bundle B.
>
> Karaf sees the change and does an update on bundle B.
>
> When the next JMS message comes into A, it calls the service exported by B
>
> And i've seen two distinct failures, and I haven't really been able to pin
> down how to uniquely replicate each.
>
> When A tries to call B, I sometimes get:
>
> getService() returned null for [interface exported by B]
>
> but also, more strangely, sometimes the call from A->B works, and when
> B->C is called I get:
>
> An Unexpected Error Occurred:
> org.osgi.service.blueprint.container.ServiceUnavailableException: The
> Blueprint container is being or has been destroyed: [interface exported by
> C, which is consumed by B]
>
> I was under the impression that the Blueprint service proxies would handle
> this kind of bundle update for me, but no matter how many times i've tried
> this, the only way i can get it to successfully work after bundle B is
> updated, is to refresh bundle A.
>
> I'm running Karaf 3.0.2 (with a patched org.apache.karaf.bundle.core jar
> file provided by Jean-Baptiste from this thread:
> http://karaf.922171.n3.nabble.com/karaf-3-0-2-bundle-watch-not-working-td4035923.html
> which makes the watch feature work in 3.0.2)
> On Java 8 update 25 (32bit), Windows 7
>
>
> I'm really looking for two things, someone confirming this behavior is
> expected, and not an issue.
>
> And if this is the expected behavior, is there a way I can automatically
> trigger the refresh of bundle A when bundle B is updated by bundle:watch?
>
> Thanks!
>
> Ed Welch
--
Charlie Mordant
Full OSGI/EE stack made with Karaf:
https://github.com/OsgiliathEnterprise/net.osgiliath.parent