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.
>
That's what I'm doing.

If you’re trying to programmatically write a prototype scoped service that
> has service dependencies then stop and use DS instead.
>
Wouldn't want to dare trying and really not sure what would be the benefit.
It's really the other way around that is really needed.


> 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
>

Thanks again.
Alain

>
> 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