Thanks for you reply Clement although I'm not sure I understand it entirely.

I use ManagedServiceFactories as well when I want to instantiate an
arbitrary number of iPOJO instances. When I require exactly one instance
then I use a ManagedService.

Although I think I understand why you recommend using a
ManagedServiceFactory  to solve the problem (I guess it forces only one
thread to call my callbacks instead of two threads), it doesn't seem like a
scenario where ManagedServiceFactories should be used. Isn't it some kind
of deficiency if my configuration is updated in the midst of my @Validate
callback? How can I ever be sure of having a consistent configuration?

I have been thinking about adding "synchronize" to my @Validate callback.
Would this be a solution? Would you recommend or argue against it?

/Bengt


2011/11/8 Clement Escoffier <[email protected]>

> Hi,
>
> Sorry for this pretty late reply…
>
> On 28.10.2011, at 11:05, Bengt Rodehav wrote:
>
> > Hello Clement,
> >
> > I have used the @Updated annotation (haven't tried the @Property on a
> method
> > though). The problem is that the @Updated method is called while I'm in
> the
> > midst of executing the @Validate method (which uses the property that is
> > being changed). I guess this must be done on separate threads (haven't
> > checked).
>
> Yes, the @Updated method is with the config admin thread, while @Validate
> is called by the iPOJO processing thread.
>
> >
> > Having updates of the configuration taking place while executing an iPOJO
> > callback (like the @Validated method) doesn't really make sense to me.
> For
> > me, it means that I use the old value (8093) in my @Validate method
> instead
> > of the new value (9991). I know that OSGi is a very dynamic environment
> and
> > the configuration can change at any time. Therefore I do reinitialize my
> > iPOJO when certain values change. The problem is that I'm only informed
> once
> > about configuration changes (@Updated) and if that happens when I'm in
> the
> > @Validated method I miss the opportunity.
> >
> > I'm probably approaching this the wrong way but do you know what best
> > practice is for the following:
> >
> > - Having a configuration property with a default value
> > - Using the configuration property to initialize the iPOJO
> > - Doing the initialization when the iPOJO becomes valid and
> re-initializing
> > whenever the property changes
> > - It must be guaranteed that the re-initialization is never done until
> the
> > first initialization has been completed (in the @Validate method) and I
> must
> > not "miss" any re-initialization.
> >
>
> If you want to be sure you get only one value, you should use a
> ManagedServiceFactory instead of a ManagedService. Then you configure the
> instance with the new value (if not set will use the default value). By
> using a ManagedServiceFactory configuration, iPOJO will creates the
> instance (so no need of @Instance) with the right configuration.
>
> Regards,
>
> Clement
>
>
> > /Bengt
> >
> >
> > 2011/10/28 Clement Escoffier <[email protected]>
> >
> >> Hi,
> >>
> >>
> >> On 27.10.2011, at 23:35, Bengt Rodehav wrote:
> >>
> >>> I'm using iPOJO and have problems with default property values.
> Consider
> >> the
> >>> following:
> >>>
> >>> *  @Property(name = "url", mandatory = true, value = "
> >>> http://localhost:8093/service";)*
> >>> *  private String mUrl;*
> >>>
> >>> If I use config admin (with fileinstall) to provide an override to the
> >> "url"
> >>> property (changing the port from 8093 to 9991), then the following
> >> happens:
> >>>
> >>> 1. My @Update method is called. The port is 8093.
> >>> 2. My @Validate method is called. It does some initialization that can
> >> take
> >>> a second or two. On entering the @Validate method the port is 8093.
> >>> 3. My @Update method is called again. The port is now 9991 which means
> >> that
> >>> this is the value from config admin. Note that my @Validate method is
> not
> >>> done at this point.
> >>> 4. My @Validate method returns. At this point the port is 9991.
> However,
> >> the
> >>> initialization code in the @Validate method used the port 8093 not 9991
> >> that
> >>> I wanted to use.
> >>>
> >>> I expected the port 9991 to be used since I had overridden the default
> >> port
> >>> (8093). I'm not sure why this is happening. How can I guarantee that
> the
> >>> overridden port is used instead of the default port?
> >>>
> >>> Note that since the update to port 9991 takes place while I'm in my
> >>> @Validate method I missed the update and I won't be informed about it
> >> again.
> >>
> >> If you want to be notified after a reconfiguration, you can use
> @Property
> >> on a method (called when the value is injected) or use the @Updated
> called
> >> when a reconfiguration occurred (and when the reconfiguration is
> completed).
> >>
> >> @Validate is called only once (or after an invalidation).
> >>
> >> Regards,
> >>
> >> Clement
> >>
> >>>
> >>> /Bengt
> >>
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: [email protected]
> >> For additional commands, e-mail: [email protected]
> >>
> >>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>

Reply via email to