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] >> Subject: Re: Instance<X> and @Disposes >> To: [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]> 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 >>> >>> > > >
