You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@felix.apache.org by João Ferreira <jt...@gmail.com> on 2009/04/03 20:23:23 UTC

OSGi services

Hello

I was doing some experimentations with OSGi services, more precisely 
what happens with bad construction of services. For example i have the 
following bundles:

    * JLService (only contains the interface JL):
          o public interface JL {public boolean read(); }
    * JL1, implementation of JLService that returns false on read method
    * JL2, implementation of JLService that returns true on read
    * JF, a bundle that consumes the JLService and gives a shell command
      to invoke JL.read()

I am implementing the registering/discovery of services the worse 
possible way.
On JL1 and JL2 start():
    ref = 
context.registerService(pt.thesis.JL.service.JL.class.getName(), new 
JL1(), null); /*in JL2 is JL2()*/
On JL1 and JL2 stop():
    ref.unregister();

On JF start():
        refs = context.getServiceReference(JL.class.getName());
        serv1 = (JL) context.getService(refs);
On JF stop():
       context.ungetService(refs);

i start the bundles and JF is binded to JL1. if i stop JL1 and call the 
command to invoke JL.read() why don't i get a runtime exception or 
something?

Hope i explained my problem well
Thanks in advance

João Ferreira
       


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@felix.apache.org
For additional commands, e-mail: users-help@felix.apache.org


Re: OSGi services

Posted by Filippo Diotalevi <fi...@gmail.com>.
On Fri, Apr 3, 2009 at 8:47 PM, David Savage <da...@paremus.com> wrote:
> But again this can get pretty fiddly with non trivial dependency
> relationships (i.e. A depends on (B and C)). For this case you might
> consider using a IOC framework like Declarative Services or iPOJO
> which handle some of the service lifecycle issues in OSGi without the
> need to use trackers.

Just to complete David's answer, also Spring DM provides the IOC.

-- 
Filippo Diotalevi

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@felix.apache.org
For additional commands, e-mail: users-help@felix.apache.org


Re: OSGi services

Posted by David Savage <da...@paremus.com>.
Hi João,

The reason is that in OSGi you get the actual object vs a proxy to the
object...so when you get the service you are getting a strong
reference to the actual object. Even though you have unregistered the
service from the OSGi registry you are still keeping the object alive
in the JVM by referring to it via a field in your class.

Beginners best practice is to not store references to services and always use:

ServiceReference refs = context.getServiceReference(JL.class.getName());
JL serv1 = (JL) context.getService(refs);
if ( serv1 != null ) serv1.read();
context.ungetService(refs);

In each call to read. But this get's verbose pretty quickly, so a
better pattern is to use org.osgi.util.tracker.ServiceTracker and
org.osgi.util.tracker.ServiceTrackerCustomizer to track the services
as they come and go. This way you can get an event via the customiser
to tell you when the service has been removed - to allow you to tidy
up your reference in your class.

But again this can get pretty fiddly with non trivial dependency
relationships (i.e. A depends on (B and C)). For this case you might
consider using a IOC framework like Declarative Services or iPOJO
which handle some of the service lifecycle issues in OSGi without the
need to use trackers.

Regards,

Dave

2009/4/3 João Ferreira <jt...@gmail.com>:
> Hello
>
> I was doing some experimentations with OSGi services, more precisely what
> happens with bad construction of services. For example i have the following
> bundles:
>
>   * JLService (only contains the interface JL):
>         o public interface JL {public boolean read(); }
>   * JL1, implementation of JLService that returns false on read method
>   * JL2, implementation of JLService that returns true on read
>   * JF, a bundle that consumes the JLService and gives a shell command
>     to invoke JL.read()
>
> I am implementing the registering/discovery of services the worse possible
> way.
> On JL1 and JL2 start():
>   ref = context.registerService(pt.thesis.JL.service.JL.class.getName(), new
> JL1(), null); /*in JL2 is JL2()*/
> On JL1 and JL2 stop():
>   ref.unregister();
>
> On JF start():
>       refs = context.getServiceReference(JL.class.getName());
>       serv1 = (JL) context.getService(refs);
> On JF stop():
>      context.ungetService(refs);
>
> i start the bundles and JF is binded to JL1. if i stop JL1 and call the
> command to invoke JL.read() why don't i get a runtime exception or
> something?
>
> Hope i explained my problem well
> Thanks in advance
>
> João Ferreira
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@felix.apache.org
> For additional commands, e-mail: users-help@felix.apache.org
>
>



-- 
-------------------------------------------------------------------------------------

Paremus Limited. Registered in England. Registration No. 4181472

Registered Office: 22-24 Broad Street, Wokingham, Berks RG40 1BA

Postal Address: 107-111 Fleet Street, London, EC4A 2AB

The information transmitted is intended only for the person(s) or
entity to which it is addressed and may contain confidential and/or
privileged material. Any review, retransmission, dissemination or
other use of, or taking of any action in reliance upon, this
information by persons or entities other than the intended recipient
is prohibited.

If you received this in error, please contact the sender and delete
the material from any computer.

-------------------------------------------------------------------------------------

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@felix.apache.org
For additional commands, e-mail: users-help@felix.apache.org