>If you don't destroy it you'll likely leak. Yes, fully agree. But the way we do it is still wrong. IF it is a @Dependent scoped instance, then we must store the DependentProvider<EntityManager> somewhere and only invoke it's destroy() method once we really need.
For NormalScoped beans you are relieved of this burden, but for @Dependent ones you need to handle it manually. The DependentProvider just helps to easily store the CreationalContext, the Bean<T> and the instance for convenience reasons. LieGrue, strub >________________________________ > From: Romain Manni-Bucau <rmannibu...@gmail.com> >To: "dev@deltaspike.apache.org" <dev@deltaspike.apache.org>; Mark Struberg ><strub...@yahoo.de> >Sent: Thursday, 10 October 2013, 9:07 >Subject: Re: git commit: DELTASPIKE-424 taking into account >EntityManagerResolver with a normal scope > > >If you don't destroy it you'll likely leak. > >And once again you are in your case where you handle the emf yourself. In >other cases @Dependent should work fine. > >That said nothing again preventing using @Dependent so just do it If it >solves the issue. Normal scopes were the important part for me. > >*Romain Manni-Bucau* >*Twitter: @rmannibucau <https://twitter.com/rmannibucau>* >*Blog: **http://rmannibucau.wordpress.com/*<http://rmannibucau.wordpress.com/> >*LinkedIn: **http://fr.linkedin.com/in/rmannibucau* >*Github: https://github.com/rmannibucau* > > > > >2013/10/10 Mark Struberg <strub...@yahoo.de> > >> >> >Both works >> >> That's exactly where I disagree. While both 'work' in the sample, >> immediately destroying the instances again after creating them - and only >> later returning the java reference to the now 'dead' EntityManagerResolver >> - is broken if you will use it in productive scenarios. >> >> >> Either we fix this, or we don't need any special handling. In this case I >> suggest to just use DependentProvider.get() for all cases. It has no harm >> on NormalScoped instances anyway. >> >> I will guard DependentProvider#destroy to not have any impact on >> @Dependent scoped instances. >> >> >> LieGrue, >> strub >> >> >> >________________________________ >> > From: Romain Manni-Bucau <rmannibu...@gmail.com> >> >To: "dev@deltaspike.apache.org" <dev@deltaspike.apache.org>; Mark >> Struberg <strub...@yahoo.de> >> >Sent: Thursday, 10 October 2013, 8:33 >> >Subject: Re: git commit: DELTASPIKE-424 taking into account >> EntityManagerResolver with a normal scope >> > >> > >> > >> >Both works Mark depending as you said from where you take your em. We >> just need to be explicit on this behavior. BTW I prefer the normal scope >> usage too. >> > >> > >> >Romain Manni-Bucau >> >Twitter: @rmannibucau >> >Blog: http://rmannibucau.wordpress.com/ >> >LinkedIn: http://fr.linkedin.com/in/rmannibucau >> >Github: https://github.com/rmannibucau >> > >> > >> > >> > >> >2013/10/10 Mark Struberg <strub...@yahoo.de> >> > >> >Not sure if we really need this flag. >> >>The most important question to me is _when_ do we trigger the destroy() >> method. >> >> >> >>The following code doesn't make much sense imo: >> >> >> >>> final DependentProvider<? extends EntityManagerResolver> resolver = >> lookupResolver(emrc); >> >>> result = resolver.get().resolveEntityManager(); >> >>> resolver.destroy(); >> >> >> >> >> >>The DependentProvider is intended to store it's instances somewhere to >> be able to properly destroy the created @Dependent instance once you don't >> need it anymore. Invoking destroy() immediately but returning the created >> contextual instance makes no sense imo. Imagine what happens if you would >> close the EntityManagerFactory in a @PreDestroy method. >> >> >> >>If there is no clean way to clean up the instance again, then we should >> only rely on NormalScoped instances and remove the handling (and get the >> warnings again, because they make sense). >> >> >> >>LieGrue, >> >>strub >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >>----- Original Message ----- >> >>> From: "rmannibu...@apache.org" <rmannibu...@apache.org> >> >>> To: comm...@deltaspike.apache.org >> >>> Cc: >> >>> Sent: Wednesday, 9 October 2013, 16:46 >> >>> Subject: git commit: DELTASPIKE-424 taking into account >> EntityManagerResolver with a normal scope >> >>> >> >>> Updated Branches: >> >>> refs/heads/master bdc9cdce6 -> e8148110e >> >>> >> >>> >> >>> DELTASPIKE-424 taking into account EntityManagerResolver with a normal >> scope >> >>> >> >>> >> >>> Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo >> >>> Commit: >> http://git-wip-us.apache.org/repos/asf/deltaspike/commit/e8148110 >> >>> Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/e8148110 >> >>> Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/e8148110 >> >>> >> >>> Branch: refs/heads/master >> >>> Commit: e8148110ea2458fa2244a439583da0f2adddb482 >> >>> Parents: bdc9cdc >> >>> Author: Romain Manni-Bucau <rmannibu...@apache.org> >> >>> Authored: Wed Oct 9 16:46:06 2013 +0200 >> >>> Committer: Romain Manni-Bucau <rmannibu...@apache.org> >> >>> Committed: Wed Oct 9 16:46:06 2013 +0200 >> >>> >> >>> ---------------------------------------------------------------------- >> >>> .../data/impl/RepositoryExtension.java | 2 +- >> >>> .../data/impl/handler/EntityManagerLookup.java | 20 +++++++++++------ >> >>> .../data/impl/meta/RepositoryComponent.java | 23 >> +++++++++++++++++++- >> >>> .../data/impl/meta/RepositoryComponents.java | 16 ++++++++------ >> >>> .../data/impl/builder/part/QueryRootTest.java | 5 ++--- >> >>> 5 files changed, 47 insertions(+), 19 deletions(-) >> >>> ---------------------------------------------------------------------- >> >>> >> >>> >> >>> >> http://git-wip-us.apache.org/repos/asf/deltaspike/blob/e8148110/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/RepositoryExtension.java >> >>> ---------------------------------------------------------------------- >> >>> diff --git >> >>> >> a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/RepositoryExtension.java >> >>> >> b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/RepositoryExtension.java >> >>> index 076393b..8ba0dca 100755 >> >>> --- >> >>> >> a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/RepositoryExtension.java >> >>> +++ >> >>> >> b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/RepositoryExtension.java >> >>> @@ -72,7 +72,7 @@ public class RepositoryExtension implements Extension >> >>> { >> >>> log.log(Level.FINER, "getHandlerClass: Repository >> >>> annotation detected on {0}", >> >>> event.getAnnotatedType()); >> >>> - RepositoryComponentsFactory.instance().add(repoClass); >> >>> + RepositoryComponentsFactory.instance().add(repoClass, >> >>> beanManager); >> >>> } >> >>> catch (RepositoryDefinitionException e) >> >>> { >> >>> >> >>> >> http://git-wip-us.apache.org/repos/asf/deltaspike/blob/e8148110/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerLookup.java >> >>> ---------------------------------------------------------------------- >> >>> diff --git >> >>> >> a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerLookup.java >> >>> >> b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerLookup.java >> >>> index 5548f16..4554497 100644 >> >>> --- >> >>> >> a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerLookup.java >> >>> +++ >> >>> >> b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerLookup.java >> >>> @@ -36,15 +36,22 @@ public class EntityManagerLookup >> >>> @Any >> >>> private Instance<EntityManager> entityManager; >> >>> >> >>> - public EntityManager lookupFor(RepositoryComponent repository) >> >>> + public EntityManager lookupFor(final RepositoryComponent >> repository) >> >>> { >> >>> EntityManager result = null; >> >>> if (repository.hasEntityManagerResolver()) >> >>> { >> >>> - DependentProvider<? extends EntityManagerResolver> >> resolver = >> >>> - >> lookupResolver(repository.getEntityManagerResolverClass()); >> >>> - result = resolver.get().resolveEntityManager(); >> >>> - resolver.destroy(); >> >>> + final Class<? extends EntityManagerResolver> emrc = >> >>> repository.getEntityManagerResolverClass(); >> >>> + if (!repository.isEntityManagerResolverIsNormalScope()) >> >>> + { >> >>> + final DependentProvider<? extends >> EntityManagerResolver> >> >>> resolver = lookupResolver(emrc); >> >>> + result = resolver.get().resolveEntityManager(); >> >>> + resolver.destroy(); >> >>> + } >> >>> + else >> >>> + { >> >>> + result = >> >>> BeanProvider.getContextualReference(emrc).resolveEntityManager(); >> >>> + } >> >>> } >> >>> else >> >>> { >> >>> @@ -60,7 +67,6 @@ public class EntityManagerLookup >> >>> private DependentProvider<? extends EntityManagerResolver> >> >>> lookupResolver( >> >>> Class<? extends EntityManagerResolver> resolverClass) >> >>> { >> >>> - DependentProvider<? extends EntityManagerResolver> resolver = >> >>> BeanProvider.getDependent(resolverClass); >> >>> - return resolver; >> >>> + return BeanProvider.getDependent(resolverClass); >> >>> } >> >>> } >> >>> >> >>> >> http://git-wip-us.apache.org/repos/asf/deltaspike/blob/e8148110/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponent.java >> >>> ---------------------------------------------------------------------- >> >>> diff --git >> >>> >> a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponent.java >> >>> >> b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponent.java >> >>> index c2dc466..5acee4e 100644 >> >>> --- >> >>> >> a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponent.java >> >>> +++ >> >>> >> b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponent.java >> >>> @@ -19,6 +19,7 @@ >> >>> package org.apache.deltaspike.data.impl.meta; >> >>> >> >>> import java.io.Serializable; >> >>> +import java.lang.annotation.Annotation; >> >>> import java.lang.reflect.Method; >> >>> import java.util.Arrays; >> >>> import java.util.Collection; >> >>> @@ -29,6 +30,8 @@ import java.util.Set; >> >>> import java.util.logging.Level; >> >>> import java.util.logging.Logger; >> >>> >> >>> +import javax.enterprise.inject.spi.Bean; >> >>> +import javax.enterprise.inject.spi.BeanManager; >> >>> import javax.persistence.FlushModeType; >> >>> >> >>> import org.apache.deltaspike.data.api.EntityManagerConfig; >> >>> @@ -53,11 +56,12 @@ public class RepositoryComponent >> >>> private final Class<?> repoClass; >> >>> private final RepositoryEntity entityClass; >> >>> private final Class<? extends EntityManagerResolver> >> >>> entityManagerResolver; >> >>> + private final boolean entityManagerResolverIsNormalScope; >> >>> private final FlushModeType entityManagerFlushMode; >> >>> >> >>> private final Map<Method, RepositoryMethod> methods = new >> >>> HashMap<Method, RepositoryMethod>(); >> >>> >> >>> - public RepositoryComponent(Class<?> repoClass, RepositoryEntity >> >>> entityClass) >> >>> + public RepositoryComponent(Class<?> repoClass, RepositoryEntity >> >>> entityClass, BeanManager beanManager) >> >>> { >> >>> if (entityClass == null) >> >>> { >> >>> @@ -67,9 +71,26 @@ public class RepositoryComponent >> >>> this.entityClass = entityClass; >> >>> this.entityManagerResolver = >> extractEntityManagerResolver(repoClass); >> >>> this.entityManagerFlushMode = >> extractEntityManagerFlushMode(repoClass); >> >>> + >> >>> + if (entityManagerResolver != null && beanManager != null) >> >>> + { >> >>> + final Set<Bean<?>> beans = >> >>> beanManager.getBeans(entityManagerResolver); >> >>> + final Class<? extends Annotation> scope = >> >>> beanManager.resolve(beans).getScope(); >> >>> + entityManagerResolverIsNormalScope = >> >>> beanManager.isNormalScope(scope); >> >>> + } >> >>> + else >> >>> + { >> >>> + entityManagerResolverIsNormalScope = false; >> >>> + } >> >>> + >> >>> initialize(); >> >>> } >> >>> >> >>> + public boolean isEntityManagerResolverIsNormalScope() >> >>> + { >> >>> + return entityManagerResolverIsNormalScope; >> >>> + } >> >>> + >> >>> public String getEntityName() >> >>> { >> >>> return EntityUtils.entityName(entityClass.getEntityClass()); >> >>> >> >>> >> http://git-wip-us.apache.org/repos/asf/deltaspike/blob/e8148110/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponents.java >> >>> ---------------------------------------------------------------------- >> >>> diff --git >> >>> >> a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponents.java >> >>> >> b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponents.java >> >>> index e6ded42..1bc12db 100644 >> >>> --- >> >>> >> a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponents.java >> >>> +++ >> >>> >> b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/meta/RepositoryComponents.java >> >>> @@ -18,6 +18,12 @@ >> >>> */ >> >>> package org.apache.deltaspike.data.impl.meta; >> >>> >> >>> +import org.apache.deltaspike.data.impl.RepositoryDefinitionException; >> >>> +import >> >>> >> org.apache.deltaspike.data.impl.meta.extractor.AnnotationMetadataExtractor; >> >>> +import >> org.apache.deltaspike.data.impl.meta.extractor.MetadataExtractor; >> >>> +import >> org.apache.deltaspike.data.impl.meta.extractor.TypeMetadataExtractor; >> >>> + >> >>> +import javax.enterprise.inject.spi.BeanManager; >> >>> import java.io.Serializable; >> >>> import java.lang.reflect.Method; >> >>> import java.util.Arrays; >> >>> @@ -25,11 +31,6 @@ import java.util.HashMap; >> >>> import java.util.List; >> >>> import java.util.Map; >> >>> >> >>> -import org.apache.deltaspike.data.impl.RepositoryDefinitionException; >> >>> -import >> >>> >> org.apache.deltaspike.data.impl.meta.extractor.AnnotationMetadataExtractor; >> >>> -import >> org.apache.deltaspike.data.impl.meta.extractor.MetadataExtractor; >> >>> -import >> org.apache.deltaspike.data.impl.meta.extractor.TypeMetadataExtractor; >> >>> - >> >>> /** >> >>> * Convenience class to access Repository and Repository method meta >> data. >> >>> * Acts as repository for Repository related meta data. >> >>> @@ -47,13 +48,14 @@ public class RepositoryComponents implements >> Serializable >> >>> /** >> >>> * Add a Repository class to the meta data repository. >> >>> * >> >>> + * >> >>> * @param repoClass The repo class. >> >>> * @return {@code true} if Repository class has been added, >> >>> {@code false} otherwise. >> >>> */ >> >>> - public void add(Class<?> repoClass) >> >>> + public void add(Class<?> repoClass, BeanManager bm) >> >>> { >> >>> RepositoryEntity entityClass = >> extractEntityMetaData(repoClass); >> >>> - RepositoryComponent repo = new RepositoryComponent(repoClass, >> >>> entityClass); >> >>> + RepositoryComponent repo = new RepositoryComponent(repoClass, >> >>> entityClass, bm); >> >>> repos.put(repoClass, repo); >> >>> } >> >>> >> >>> >> >>> >> http://git-wip-us.apache.org/repos/asf/deltaspike/blob/e8148110/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/builder/part/QueryRootTest.java >> >>> ---------------------------------------------------------------------- >> >>> diff --git >> >>> >> a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/builder/part/QueryRootTest.java >> >>> >> b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/builder/part/QueryRootTest.java >> >>> index f904bb2..1c70466 100644 >> >>> --- >> >>> >> a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/builder/part/QueryRootTest.java >> >>> +++ >> >>> >> b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/builder/part/QueryRootTest.java >> >>> @@ -30,9 +30,8 @@ import org.junit.Test; >> >>> >> >>> public class QueryRootTest >> >>> { >> >>> - >> >>> - private final RepositoryComponent repo = new >> >>> RepositoryComponent(SimpleRepository.class, new >> RepositoryEntity(Simple.class, >> >>> Long.class)); >> >>> - private final RepositoryComponent repoFetchBy = new >> >>> RepositoryComponent(SimpleFetchRepository.class, new >> >>> RepositoryEntity(Simple.class, Long.class)); >> >>> + private final RepositoryComponent repo = new >> >>> RepositoryComponent(SimpleRepository.class, new >> RepositoryEntity(Simple.class, >> >>> Long.class), null); >> >>> + private final RepositoryComponent repoFetchBy = new >> >>> RepositoryComponent(SimpleFetchRepository.class, new >> >>> RepositoryEntity(Simple.class, Long.class), null); >> >>> >> >>> @Test >> >>> public void should_create_simple_query() >> >>> >> >> >> > >> > >> > >> > > >