Please note that up to a couple of weeks ago there was a bug in Felix SCR managing indirect component prototype instances.
https://issues.apache.org/jira/browse/FELIX-5974 So you may want to make sure you have the latest. - Ray On Sun, Nov 25, 2018, 08:21 Alain Picard via osgi-dev < osgi-dev@mail.osgi.org wrote: > 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
_______________________________________________ OSGi Developer Mail List osgi-dev@mail.osgi.org https://mail.osgi.org/mailman/listinfo/osgi-dev