On Sun, Nov 25, 2018 at 7:50 AM Tim Ward <tim.w...@paremus.com> wrote:

> If your DS component ‘X’ is injected with a Component Service Objects
> which it uses to get instances ‘A’, ‘B’ and ‘C' of a referenced service
> then those service instances will be released when either:
>
>
>    - The component ‘X’ releases them by calling ungetService on the
>    component service objects
>
> or
>
>    - The component ‘X’ is deactivated (for whatever reason) at which
>    point the Service Component Runtime will automatically release any
>    remaining instances that haven’t been released by the component before the
>    end of any deactivate method.
>
>
> This is why the ComponentServiceObjects is a better choice than using a
> ServiceObjects directly, as the ServiceObjects won’t clean up after you.
>
> Can I interpret this and your previous comment as meaning that within a
> prototype scope component, a prototype required scope reference doesn't
> need to be "unget" manually and it is just the most outer invocation that
> should perform the “unget"
>
>
> In a limited way, yes. If you get many instances over the lifetime of your
> component ‘X’ then you should probably have a mechanism to unget them
> manually, otherwise the memory usage of your component will grow and grow
> over time (until it is deactivated). If you get two or three instances of
> the prototype service which you then hold for the life of the component ‘X’
> then feel free to let DS do all the work.
>
This is for a composing a UI view which itself has a defined lifespan, but
this prototype component creates a number of other prototype scoped
components and it would be much easier to such unget the view and not all
its parts.

Small slant to this question, let's say that X has a reference to Factory A
(standard component) and that factory A returns a prototype scoped
instance, will ungetting X, release the instance returned by factory A?

Alain



> Tim
>
> On 25 Nov 2018, at 12:41, Alain Picard <pic...@castortech.com> wrote:
>
> Tim,
>
> Circling back on this. Re-reading section 112.3.6 it says "This means that
> if a component instance used a Component Service Objects object to obtain
> service objects, SCR must track those service objects so that when the
> service becomes unbound, SCR can unget any unreleased service objects".
>
> Can I interpret this and your previous comment as meaning that within a
> prototype scope component, a prototype required scope reference doesn't
> need to be "unget" manually and it is just the most outer invocation that
> should perform the "unget"
>
> Thanks
> Alain
>
> On Thu, Aug 23, 2018 at 9:20 AM Tim Ward <tim.w...@paremus.com> wrote:
>
>> If you’re using Declarative Services to consume these other dynamic
>> references then there is no need to worry. If you’re trying to
>> programmatically write a prototype scoped service that has service
>> dependencies then stop and use DS instead. Trying to correctly manage the
>> “unget” chains that need to occur when one service in a dependency tree is
>> unregistered is just too hard to be worthwhile. Tools like the
>> ServiceTracker can make it tractable, but it still leaves you writing huge
>> quantities of messy lifecycle code that’s a nightmare to debug.
>>
>> Also, you are correct that you must not keep using a service instance
>> when the service has been unregistered. It is your job to discard that
>> reference :).
>>
>> Tim
>>
>> On 23 Aug 2018, at 13:31, Alain Picard <pic...@castortech.com> wrote:
>>
>> Just a small note, I should have stated that my worry is about the unget
>> timing. I obviously have a reference to the object and this won't disappear
>> by itself, but if that service has other dynamic references that go away
>> and I keep using the service, I might be in trouble. But I guess the
>> template that I used already had a bit that issue with the supplier (which
>> we seldom use).
>>
>> Alain
>>
>> On Thu, Aug 23, 2018 at 7:43 AM Alain Picard <pic...@castortech.com>
>> wrote:
>>
>>> Tim,
>>>
>>> Based on your referenced javadoc, some more googling, I used and adapted
>>> from our own current tracker and supplier to create some Prototype
>>> versions. Tests are showing correct results, but this is not directly using
>>> the PrototypeServiceFactory, so I would appreciate a very quick
>>> confirmation that I'm not missing anything.
>>>
>>> Thanks
>>>
>>> Alain
>>>
>>>
>>> On Wed, Aug 22, 2018 at 11:54 AM Alain Picard <pic...@castortech.com>
>>> wrote:
>>>
>>>> Thanks! I actually saw that being called by ComponentServiceObjects
>>>> while perusing the code.
>>>>
>>>> Alain
>>>>
>>>>
>>>> On Wed, Aug 22, 2018 at 11:52 AM Tim Ward <tim.w...@paremus.com> wrote:
>>>>
>>>>> Registering a prototype service is almost as easy as registering a
>>>>> singleton service. Instead of registering a single object you register an
>>>>> instance of PrototypeServiceFactory
>>>>> <https://osgi.org/javadoc/r6/core/org/osgi/framework/PrototypeServiceFactory.html>.
>>>>> This will get called by the framework to get and release instances as
>>>>> needed.
>>>>>
>>>>> Tim
>>>>>
>>>>> On 22 Aug 2018, at 16:49, Alain Picard <pic...@castortech.com> wrote:
>>>>>
>>>>> Tim,
>>>>>
>>>>> This helps quite a bit and clarifies a few points for me. As someone
>>>>> who is migrating from a pre-DS environment and dealing with lots of 
>>>>> legacy,
>>>>> how can prototype scoped services be used outside of DS? That would be
>>>>> fantastic. Right now we have a good solution to use singleton services
>>>>> outside of DS but not for "factory" type services.
>>>>>
>>>>> Thanks
>>>>> Alain
>>>>>
>>>>>
>>>>> On Wed, Aug 22, 2018 at 11:27 AM Tim Ward <tim.w...@paremus.com>
>>>>> wrote:
>>>>>
>>>>>> Hi Alain,
>>>>>>
>>>>>> A "Prototype scoped" service is one where the client(s) can request
>>>>>> an arbitrary number of instances of the “same” service, whereas a
>>>>>> ComponentFactory is a mechanism for the clients to request an arbitrary
>>>>>> number of differently configured component instances.
>>>>>>
>>>>>> From the perspective of the component the key difference is that all
>>>>>> of the instances of a prototype scoped component have the same component
>>>>>> properties, and the instances created by the factory component have the
>>>>>> combination of these component properties *plus* the properties passed to
>>>>>> the factory.
>>>>>>
>>>>>> In some senses prototype scoped services are better because they:
>>>>>>
>>>>>>
>>>>>>    - Don’t require the service implementation to use DS (they may
>>>>>>    wish to use something else)
>>>>>>    - Will have satisfied references and configurations (component
>>>>>>    factories can be given configuration which invalidates the 
>>>>>> registration
>>>>>>    resulting in an error)
>>>>>>
>>>>>>
>>>>>> The main reason that you would use a Component Factory rather than a
>>>>>> prototype scoped service is if you genuinely want to have different
>>>>>> specialised configurations for each instance, and it doesn’t make sense 
>>>>>> to
>>>>>> use a managed service factory (i.e. the customised instances are only
>>>>>> interesting to one client, or must not be shared for some reason).
>>>>>>
>>>>>> If your instances are identically configured (or can be, with an init
>>>>>> later) then a ComponentServiceObjects getService() call should be all you
>>>>>> need each time you need a new instance, followed by a call to
>>>>>> ungetService() later when you’re done with it.
>>>>>>
>>>>>> Tim
>>>>>>
>>>>>> On 22 Aug 2018, at 12:06, Alain Picard <pic...@castortech.com> wrote:
>>>>>>
>>>>>> On the 2nd part of the question regarding
>>>>>> ComponentFactory/ComponentInstance vs Prototype/ComponentServiceObjects. 
>>>>>> I
>>>>>> get the feeling that CSO should be favored, but I saw an old post from
>>>>>> Scott Lewis about configuration and that is a bit close to some of my use
>>>>>> cases.
>>>>>>
>>>>>> I have cases where I have a Factory component that delivers instances
>>>>>> and calls an init method to configure the component, or might sometimes
>>>>>> return an existing matching one that is already cached (like per data
>>>>>> connection instances). With ComponentFactory I can create a new instance,
>>>>>> call init on the new instance and return the ComponentInstance. The 
>>>>>> caller
>>>>>> can then call getInstance and call dispose when done. I struggle to find 
>>>>>> a
>>>>>> correct/easy way to do this with CSO. Am I using the best approach or 
>>>>>> not?
>>>>>>
>>>>>> Thanks
>>>>>> Alain
>>>>>>
>>>>>>
>>>>>> On Wed, Aug 22, 2018 at 3:46 AM Tim Ward via osgi-dev <
>>>>>> osgi-dev@mail.osgi.org> wrote:
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On 21 Aug 2018, at 20:53, Paul F Fraser via osgi-dev <
>>>>>>> osgi-dev@mail.osgi.org> wrote:
>>>>>>>
>>>>>>> On 22/08/2018 5:40 AM, Paul F Fraser via osgi-dev wrote:
>>>>>>>
>>>>>>> On 21/08/2018 10:00 PM, Tim Ward via osgi-dev wrote:
>>>>>>>
>>>>>>> Have you looked at what the OSC project does? It uses Vaadin, and
>>>>>>> uses the ViewProvider interface to provide view instances. These
>>>>>>> automatically have a detach listener added on creation so that they get
>>>>>>> correctly disposed when their parent container is closed.
>>>>>>>
>>>>>>> See
>>>>>>> https://github.com/opensecuritycontroller/osc-core/blob/4441c96fe49e4b11ce6f380a440367912190a246/osc-ui/src/main/java/org/osc/core/broker/view/OSCViewProvider.java#L60-L67
>>>>>>>  for
>>>>>>> details.
>>>>>>>
>>>>>>> Tim
>>>>>>>
>>>>>>>
>>>>>>> Hi Tim,
>>>>>>> The R7 Spec 112.3.6 states that "SCR must unget any unreleased
>>>>>>> service objects" and it sounds to me that the system is supposed to 
>>>>>>> clean
>>>>>>> itself up.
>>>>>>> What am I missing.
>>>>>>>
>>>>>>> What am I missing?
>>>>>>>
>>>>>>> Apart from a question mark.. that is.
>>>>>>>
>>>>>>>
>>>>>>> Hi Paul,
>>>>>>>
>>>>>>> You are correct in your interpretation of the specification, however…
>>>>>>>
>>>>>>>
>>>>>>>    1. This only happens if you use ComponentServiceObjects, not
>>>>>>>    ServiceObjects (which is why this type was added to the DS spec). If 
>>>>>>> you
>>>>>>>    use ServiceObjects directly then SCR cannot reference count them and 
>>>>>>> cannot
>>>>>>>    help you.
>>>>>>>    2. The “leaked” instances are only cleaned up when your
>>>>>>>    component is disposed by SCR (for example if it becomes unsatisfied).
>>>>>>>
>>>>>>>
>>>>>>> In this case we *are* using ComponentServiceObjects (good) but we
>>>>>>> need to dispose of the referenced instance when the UI view is closed.
>>>>>>>
>>>>>>> If we left it up to SCR to clean up, and our component wasn’t
>>>>>>> deactivated/disposed between UI sessions then we would have a memory 
>>>>>>> leak.
>>>>>>> In general when you use ComponentServiceObjects you should think about 
>>>>>>> the
>>>>>>> lifecycle of the objects you create, and how they are going to be 
>>>>>>> released.
>>>>>>> In this case the component may get an arbitrarily large (and increasing)
>>>>>>> number of instances over time, so it must also dispose of them. If the
>>>>>>> example just grabbed 2 (or 5, or 10) instances at activation and used 
>>>>>>> them
>>>>>>> until deactivation then it would not be necessary to release them (SCR
>>>>>>> would do it for us).
>>>>>>>
>>>>>>> I hope that this makes sense,
>>>>>>>
>>>>>>> Tim
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Paul Fraser
>>>>>>> _______________________________________________
>>>>>>> OSGi Developer Mail List
>>>>>>> osgi-dev@mail.osgi.org
>>>>>>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> OSGi Developer Mail List
>>>>>>> osgi-dev@mail.osgi.org
>>>>>>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> OSGi Developer Mail List
>>>>>>> osgi-dev@mail.osgi.org
>>>>>>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>
>
_______________________________________________
OSGi Developer Mail List
osgi-dev@mail.osgi.org
https://mail.osgi.org/mailman/listinfo/osgi-dev

Reply via email to