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