I'll take a look at it. Thanks,
Xavier ________________________________ > Date: Mon, 23 Jun 2014 16:10:34 +0100 > From: [email protected] > Subject: Re: Instance<X> and @Disposes > To: [email protected] > > Please take a look at Apache DeltaSpike BeanProvider#getDependent. > This gives you a wrapper object which allows manual disposal as well. > > LieGrue, > strub > > > On Monday, 23 June 2014, 17:07, Xavier Dury <[email protected]> wrote: > > > Hi Mark, > > Thanks for your answer. > > Indeed, my producer creates a @Dependent scoped FTPClient. > > I'm not using @RequestScoped or any other scope because this code is > triggered by a @Schedule method. > > I'm not directly @Injecting ftpClient in my MyService class because the > same instance of FTPClient would always be used, that's why I turned it > into an Instance<FTPClient> in the first place (to be sure to work with > a fresh FTPClient everytime I call get()). > > But now, I don't really know how to dispose it properly (using @Disposes). > > The best solution would be to create some sort of ThreadLocalContext > like this: > > public class FTPClientProducer { > > @Produces > @ThreadLocalScoped > FTPClient newFTPClient() {...} > > } > > public MyService { > > @RunInThreadLocalContext // activate ThreadLocalContext for this > invocation through an interceptor > void doSomething() {...} > } > > but before going that way, I wanted to know if there was something in > CDI which allowed me to easily/simply dispose a bean. > > Regards, > > Xavier > > ---------------------------------------- >> Date: Mon, 23 Jun 2014 15:40:55 +0100 >> From: [email protected]<mailto:[email protected]> >> Subject: Re: Instance<X> and @Disposes >> To: [email protected]<mailto:[email protected]> >> >> Hi Xavier! >> >> Short answer: NormalScoped beans have their own lifecycle and will > get destroyed whenever the Context ends. Eg. for @RequestScoped > FTPClient it will get destroyed at the end of each request. >> >> For @Dependent scoped contextual instances we store the > CreationalContext with the bean containing the outermost Instance. >> >> >> As I understand your method @Produces FTPClient newFTPClient() > creates a @Dependent scoped FTPClient, right? >> >> In this case the @Disposes method for all FTPClients created over > time will get called when your @Stateless MyService gets disposed. This > happens if e.g. the container shuts down, if the instance gets removed > from the pool or (in some containers) if the pool timeout exceeds (some > containers only keep pooled @Stateless instances for 6000 seconds and > then create fresh ones). >> >> >> Any further questions? Just keep asking :) >> >> >> LieGrue, >> strub >> >> >> >> On Monday, 23 June 2014, 16:26, Xavier Dury > <[email protected]<mailto:[email protected]>> wrote: >> >> >>> >>> >>>Hi, >>> >>>I was wondering how an object provided by an Instance<X> could be >>>disposed through the correct @Disposes method without explicitly >>>calling that method. >>> >>>For example: >>> >>>public class FTPClientProducer { >>> >>> @Produces >>> FTPClient newFTPClient() {...} >>> >>> void closeFTPClient(@Disposes FTPClient ftpClient) {...} >>>} >>> >>>@Stateless >>>public class MyService { >>> >>> @Inject >>> Instance<FTPClient> ftpClientProvider; >>> >>> void doSomething() { >>> FTPClient ftpClient = ftpClientProvider.get(); >>> try { >>> ... >>> } finally { >>> ??? (close ftpClient ) >>> } >>> } >>>} >>> >>>Ideally, I would like to replace ??? by something like: >>> >>>ftpClientProvider.dispose(ftpClient); >>> >>>Is there something in CDI which provides that kind of feature? >>> >>>Regards, >>> >>>Xavier >>> >>> > > >
