Hi,

I would like to deploy on OSGI platform (Karaf) two different versions (but
could be more) of an OSGI service (org.acme.common.HelloWorldService - v1 &
v2). For that purpose I have created 2 Blueprint XML config files, packaged
the bundles and deploy them on karaf

[  57] [Active     ] [Created     ] [   80] Acme :: OSGI :: Client (1.0.0)
[  60] [Active     ] [Created     ] [   80] Acme :: OSGI :: Commons :: v1
(1.0.0)

Here is an example of blueprint config for Commons V1

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0";
           xmlns:cm="
http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0";>

  <cm:property-placeholder id="property-placeholder"
                           persistent-id="config.v1"/>

  <bean id="helloWorldService" class="org.acme.common.HelloWorldServiceImpl"
        init-method="init" destroy-method="destroy">
    <property name="version" value="${version}"/>
  </bean>

  <service ref="helloWorldService"
           interface="org.acme.common.HelloWorldService"
           ranking="100">
    <service-properties>
      <entry key="version" value="v1"/>
    </service-properties>
  </service>

</blueprint>

Now, a bundle, which is a client of a service will consume it.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0";>

  <bean id="helloWorldClient" class="org.acme.client.HelloWorldClient"
        init-method="callService">
    <property name="service" ref="helloWorldService"/>
  </bean>

  <reference id="helloWorldService"
             interface="org.acme.common.HelloWorldService"
             filter="(version=v1)"/>

</blueprint>

That works fine.

If now, I would like, that the client uses the latest version of the
service v2 (and not v1) when we have 2 OSGI Services deployed on OSGI
Registry, I must specifically specified that it must import the package
"org.acme.common;version=2.0".
But when I use a version range to let the bundle to take the latest version
available, then I get this error

[  57] [Active     ] [Failure     ] [   80] Acme :: OSGI :: Client (1.0.0)
[  60] [Active     ] [Created     ] [   80] Acme :: OSGI :: Commons :: v1
(1.0.0)
[  61] [Active     ] [Created     ] [   80] Acme :: OSGI :: Commons :: v2
(2.0.0)

Caused by: java.lang.ClassCastException:
org.acme.common.HelloWorldServiceImpl cannot be cast to
org.acme.common.HelloWorldService
at Proxy93f66d24_52d9_49b4_9d6c_8c65ce3ef1f1.callService(Unknown Source)
at org.acme.client.HelloWorldClient.callService(HelloWorldClient.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.6.0_45]

Remark : Doing a refresh of the bundle client does not allow the bundle to
load the latest package version available.

karaf@root> packages:exports 60
    ID Packages
    60 org.acme.common; version=1.0.0
karaf@root> packages:exports 61
    ID Packages
    61 org.acme.common; version=2.0.0

karaf@root> packages:imports 57
Acme :: OSGI :: Commons :: v1 (60): org.acme.common; version=1.0.0

Is there a workaround to allow a bundle which is a client of an OSGI
Service (= Proxy object) to use the bundle containing the latest package
version deployed ?

Regards,

-- 
Charles Moulliard
Apache Committer / Architect @RedHat
Twitter : @cmoulliard | Blog : http://cmoulliard.blogspot.com

Reply via email to