[cdi-dev] Destroying @Stateless proxies obtained via CDI.current().select()

John D. Ament john.d.ament at gmail.com
Tue May 10 19:35:20 EDT 2016


Arjan,

So this recently came up as well with a PR raised to clarify how instance
is used to destroy references: https://github.com/cdi-spec/cdi/pull/286

Take a look at the last paragraph here:
http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#dynamic_lookup

John

On Tue, May 10, 2016 at 11:11 AM arjan tijms <arjan.tijms at gmail.com> wrote:

> Hi,
>
> Given a simple @Stateless bean:
>
> @Stateless
> public class Foo {
>     public void bar() {}
> }
>
> Then requesting an instance of this via CDI as follows:
>
> Foo foo = CDI.current().select(Foo.class).get();
>
> Causes a lot of leaked proxy instances (at least on Weld). Now what I
> guess needs to be done is destroying the proxy, taking Antoine's answer
> here as a lead:
> http://stackoverflow.com/questions/28767536/scope-of-stateless-bean
>
> Only the following throws an UnsupportedOperationException (on Weld 2.3.2,
> haven't tested OWB yet)
>
> Instance<Foo> fooInstance = CDI.current().select(Foo.class);
> Foo foo = fooInstance.get();
> foo.bar();
> fooInstance.destroy(foo);
>
> The question is, is this how it's supposed to be done via the spec?
>
> Implementation wise, what happens in Weld is that the CDI/EJB proxy
> (com.test.Foo$Proxy$_$$_Weld$EnterpriseProxy$) in the following code
> doesn't hit the check for a dependent instance (comments in capitals added
> by me):
>
>
>     public void destroy(T instance) {
>         Preconditions.checkNotNull(instance);
>
>         // check if this is a proxy of a normal-scoped bean
>         if (instance instanceof ProxyObject) {
>
>             // THIS BRANCH IS TAKEN FOR CDI/EJB PROXY
>
>             ProxyObject proxy = (ProxyObject) instance;
>             if (proxy.getHandler() instanceof ProxyMethodHandler) {
>                 ProxyMethodHandler handler = (ProxyMethodHandler)
> proxy.getHandler();
>                 Bean<?> bean = handler.getBean();
>                 Context context =
> getBeanManager().getContext(bean.getScope());
>                 if (context instanceof AlterableContext) {
>                     AlterableContext alterableContext = (AlterableContext)
> context;
>
>                     // CONTEXT IS A DEPENDENTCONTEXTIMPL THAT THROWS
>                     // UnsupportedOperationException FROM ITS DESTROY()
> METHOD
>                     alterableContext.destroy(bean);
>                     return;
>                 } else {
>                     throw BeanLogger.LOG.destroyUnsupported(context);
>                 }
>             }
>         }
>
>         // check if this is a dependent instance
>         CreationalContext<? super T> ctx = getCreationalContext();
>         if (ctx instanceof WeldCreationalContext<?>) {
>             WeldCreationalContext<? super T> weldCtx = cast(ctx);
>
>             // PROXY REFERENCES ARE KEPT HERE IN A
>             // "dependentInstances" LIST, AND WOULD BE CLEARED HERE
>             // BUT THIS CODE IS NEVER REACHED
>             weldCtx.destroyDependentInstance(instance);
>         }
>     }
>
> Now I wonder, am I doing something wrong (according to the CDI spec), or
> could this be a bug in the Weld code?
>
> Kind regards,
> Arjan Tijms
> _______________________________________________
> cdi-dev mailing list
> cdi-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/cdi-dev
>
> Note that for all code provided on this list, the provider licenses the
> code under the Apache License, Version 2 (
> http://www.apache.org/licenses/LICENSE-2.0.html). For all other ideas
> provided on this list, the provider waives all patent and other
> intellectual property rights inherent in such information.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/cdi-dev/attachments/20160510/05897aec/attachment.html 


More information about the cdi-dev mailing list