Thanks Raymond On Sun, Nov 25, 2018, 6:58 PM Raymond Auge <raymond.a...@liferay.com wrote:
> 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