Call close on finalize
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/7e07f10b Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/7e07f10b Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/7e07f10b Branch: refs/heads/tomee-1.7.3-prepare Commit: 7e07f10b47149ce4a01441d186a7c8316e2156bc Parents: 05855aa Author: AndyGee <andy...@gmx.de> Authored: Wed Nov 18 19:51:32 2015 +0100 Committer: AndyGee <andy...@gmx.de> Committed: Wed Nov 18 19:51:32 2015 +0100 ---------------------------------------------------------------------- .../org/apache/openejb/OpenEjbContainer.java | 25 +- .../openejb/core/ivm/naming/ContextWrapper.java | 11 + .../junit/context/OpenEjbTestContext.java | 11 + .../apache/tomee/RemoteTomEEEJBContainer.java | 333 ++++++++++--------- .../apache/tomee/catalina/OpenEJBContext.java | 42 ++- .../tomee/embedded/EmbeddedTomEEContainer.java | 11 + 6 files changed, 265 insertions(+), 168 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/7e07f10b/container/openejb-core/src/main/java/org/apache/openejb/OpenEjbContainer.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/OpenEjbContainer.java b/container/openejb-core/src/main/java/org/apache/openejb/OpenEjbContainer.java index 5f42516..803b6cf 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/OpenEjbContainer.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/OpenEjbContainer.java @@ -115,11 +115,11 @@ public final class OpenEjbContainer extends EJBContainer { private static Logger logger; // initialized lazily to get the logging config from properties private ServiceManagerProxy serviceManager; - private Options options; - private OpenEjbContainer.GlobalContext globalJndiContext; - private WebBeansContext webBeanContext; - private ServletContext servletContext; - private HttpSession session; + private final Options options; + private final OpenEjbContainer.GlobalContext globalJndiContext; + private final WebBeansContext webBeanContext; + private final ServletContext servletContext; + private final HttpSession session; private OpenEjbContainer(final Map<?, ?> map, final AppContext appContext) { webBeanContext = appContext.getWebBeansContext(); @@ -142,6 +142,17 @@ public final class OpenEjbContainer extends EJBContainer { } @Override + protected void finalize() throws Throwable { + try { + this.close(); + } catch (final Exception e) { + //no-op + } finally { + super.finalize(); + } + } + + @Override public void close() { if (isSingleClose()) { return; @@ -329,6 +340,10 @@ public final class OpenEjbContainer extends EJBContainer { final Assembler assembler = SystemInstance.get().getComponent(Assembler.class); + if(null == assembler){ + throw new IllegalStateException("Assembler has not been initialized"); + } + final AppContext appContext; try { http://git-wip-us.apache.org/repos/asf/tomee/blob/7e07f10b/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/ContextWrapper.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/ContextWrapper.java b/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/ContextWrapper.java index 2ff0ac6..fc2f94c 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/ContextWrapper.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/ContextWrapper.java @@ -181,4 +181,15 @@ public class ContextWrapper implements Context { public void unbind(final String name) throws NamingException { context.unbind(name); } + + @Override + protected void finalize() throws Throwable { + try { + this.close(); + } catch (final Exception e) { + //no-op + } finally { + super.finalize(); + } + } } http://git-wip-us.apache.org/repos/asf/tomee/blob/7e07f10b/container/openejb-junit/src/main/java/org/apache/openejb/junit/context/OpenEjbTestContext.java ---------------------------------------------------------------------- diff --git a/container/openejb-junit/src/main/java/org/apache/openejb/junit/context/OpenEjbTestContext.java b/container/openejb-junit/src/main/java/org/apache/openejb/junit/context/OpenEjbTestContext.java index 26c464b..df2bf02 100644 --- a/container/openejb-junit/src/main/java/org/apache/openejb/junit/context/OpenEjbTestContext.java +++ b/container/openejb-junit/src/main/java/org/apache/openejb/junit/context/OpenEjbTestContext.java @@ -134,6 +134,17 @@ public class OpenEjbTestContext implements TestContext { } @Override + protected void finalize() throws Throwable { + try { + this.close(); + } catch (final Exception e) { + //no-op + } finally { + super.finalize(); + } + } + + @Override public void close() { try { initialContext.close(); http://git-wip-us.apache.org/repos/asf/tomee/blob/7e07f10b/tomee/apache-tomee/src/main/java/org/apache/tomee/RemoteTomEEEJBContainer.java ---------------------------------------------------------------------- diff --git a/tomee/apache-tomee/src/main/java/org/apache/tomee/RemoteTomEEEJBContainer.java b/tomee/apache-tomee/src/main/java/org/apache/tomee/RemoteTomEEEJBContainer.java index 95b8a38..67f68b1 100644 --- a/tomee/apache-tomee/src/main/java/org/apache/tomee/RemoteTomEEEJBContainer.java +++ b/tomee/apache-tomee/src/main/java/org/apache/tomee/RemoteTomEEEJBContainer.java @@ -1,161 +1,172 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * <p/> - * http://www.apache.org/licenses/LICENSE-2.0 - * <p/> - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.tomee; - -import org.apache.geronimo.osgi.locator.ProviderLocator; -import org.apache.openejb.OpenEJBException; -import org.apache.openejb.assembler.Deployer; -import org.apache.openejb.assembler.DeployerEjb; -import org.apache.openejb.client.RemoteInitialContextFactory; -import org.apache.openejb.config.RemoteServer; -import org.apache.openejb.loader.IO; -import org.apache.tomee.util.QuickServerXmlParser; - -import javax.ejb.EJBException; -import javax.ejb.embeddable.EJBContainer; -import javax.ejb.spi.EJBContainerProvider; -import javax.naming.Context; -import javax.naming.InitialContext; -import javax.validation.ValidationException; -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Properties; - -public class RemoteTomEEEJBContainer extends EJBContainer { - private static RemoteTomEEEJBContainer instance; - private RemoteServer container; - private InitialContext context; - - @Override - public void close() { - instance.container.destroy(); - instance.container = null; - } - - @Override - public Context getContext() { - return context; - } - - public static class Provider implements EJBContainerProvider { - private static final List<String> CONTAINER_NAMES = Arrays.asList(RemoteTomEEEJBContainer.class.getName(), "tomee-remote", "remote-tomee"); - - @Override - public EJBContainer createEJBContainer(final Map<?, ?> properties) { - final Object provider = properties.get(EJBContainer.PROVIDER); - int ejbContainerProviders = 1; - try { - ejbContainerProviders = ProviderLocator.getServices(EJBContainerProvider.class.getName(), EJBContainer.class, Thread.currentThread().getContextClassLoader()).size(); - } catch (final Exception e) { - // no-op - } - - if ((provider == null && ejbContainerProviders > 1) - || (!RemoteTomEEEJBContainer.class.equals(provider) - && !CONTAINER_NAMES.contains(String.valueOf(provider)))) { - return null; - } - - if (instance != null) { - return instance; - } - - final Object modules = properties.get(EJBContainer.MODULES); - - System.getProperties().putAll(properties); - final File home = new File(System.getProperty("openejb.home", "doesn't exist")); - if (!home.exists()) { - throw new IllegalArgumentException("You need to set openejb.home"); - } - - final QuickServerXmlParser parser = QuickServerXmlParser.parse(new File(home, "conf/server.xml")); - final String remoteEjb = System.getProperty(Context.PROVIDER_URL, "http://" + parser.host() + ":" + parser.http() + "/tomee/ejb"); - - try { - instance = new RemoteTomEEEJBContainer(); - instance.container = new RemoteServer(); - instance.container.setPortStartup(Integer.parseInt(parser.http())); - - try { - instance.container.start(); - } catch (final Exception e) { - instance.container.destroy(); - throw e; - } - - instance.context = new InitialContext(new Properties() {{ - setProperty(Context.INITIAL_CONTEXT_FACTORY, RemoteInitialContextFactory.class.getName()); - setProperty(Context.PROVIDER_URL, remoteEjb); - }}); - - final Deployer deployer = Deployer.class.cast(instance.context.lookup("openejb/DeployerBusinessRemote")); - - if (modules instanceof File) { - final File file = File.class.cast(modules); - deployFile(deployer, file); - } else if (modules instanceof String) { - final String path = String.class.cast(modules); - final File file = new File(path); - deployFile(deployer, file); - } else if (modules instanceof String[]) { - for (final String path : (String[]) modules) { - deployFile(deployer, new File(path)); - } - } else if (modules instanceof File[]) { - for (final File file : (File[]) modules) { - deployFile(deployer, file); - } - } // else suppose already deployed - - return instance; - } catch (final OpenEJBException e) { - throw new EJBException(e); - } catch (final MalformedURLException e) { - throw new EJBException(e); - } catch (final ValidationException ve) { - throw ve; - } catch (final Exception e) { - if (e instanceof EJBException) { - throw (EJBException) e; - } - throw new TomEERemoteEJBContainerException("initialization exception", e); - } - } - } - - private static void deployFile(final Deployer deployer, final File file) throws IOException, OpenEJBException { - if ("true".equalsIgnoreCase(System.getProperty(DeployerEjb.OPENEJB_USE_BINARIES, "false"))) { - final Properties props = new Properties(); - final byte[] slurpBinaries = IO.slurp(file).getBytes(); - props.put(DeployerEjb.OPENEJB_VALUE_BINARIES, slurpBinaries); - props.put(DeployerEjb.OPENEJB_PATH_BINARIES, file.getName()); - deployer.deploy(file.getAbsolutePath(), props); - } else { - deployer.deploy(file.getAbsolutePath()); - } - } - - protected static class TomEERemoteEJBContainerException extends RuntimeException { - protected TomEERemoteEJBContainerException(final String s, final Exception e) { - super(s, e); - } - } -} +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * <p/> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p/> + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.tomee; + +import org.apache.geronimo.osgi.locator.ProviderLocator; +import org.apache.openejb.OpenEJBException; +import org.apache.openejb.assembler.Deployer; +import org.apache.openejb.assembler.DeployerEjb; +import org.apache.openejb.client.RemoteInitialContextFactory; +import org.apache.openejb.config.RemoteServer; +import org.apache.openejb.loader.IO; +import org.apache.tomee.util.QuickServerXmlParser; + +import javax.ejb.EJBException; +import javax.ejb.embeddable.EJBContainer; +import javax.ejb.spi.EJBContainerProvider; +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.validation.ValidationException; +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +public class RemoteTomEEEJBContainer extends EJBContainer { + private static RemoteTomEEEJBContainer instance; + private RemoteServer container; + private InitialContext context; + + @Override + protected void finalize() throws Throwable { + try { + this.close(); + } catch (final Exception e) { + //no-op + } finally { + super.finalize(); + } + } + + @Override + public void close() { + instance.container.destroy(); + instance.container = null; + } + + @Override + public Context getContext() { + return context; + } + + public static class Provider implements EJBContainerProvider { + private static final List<String> CONTAINER_NAMES = Arrays.asList(RemoteTomEEEJBContainer.class.getName(), "tomee-remote", "remote-tomee"); + + @Override + public EJBContainer createEJBContainer(final Map<?, ?> properties) { + final Object provider = properties.get(EJBContainer.PROVIDER); + int ejbContainerProviders = 1; + try { + ejbContainerProviders = ProviderLocator.getServices(EJBContainerProvider.class.getName(), EJBContainer.class, Thread.currentThread().getContextClassLoader()).size(); + } catch (final Exception e) { + // no-op + } + + if ((provider == null && ejbContainerProviders > 1) + || (!RemoteTomEEEJBContainer.class.equals(provider) + && !CONTAINER_NAMES.contains(String.valueOf(provider)))) { + return null; + } + + if (instance != null) { + return instance; + } + + final Object modules = properties.get(EJBContainer.MODULES); + + System.getProperties().putAll(properties); + final File home = new File(System.getProperty("openejb.home", "doesn't exist")); + if (!home.exists()) { + throw new IllegalArgumentException("You need to set openejb.home"); + } + + final QuickServerXmlParser parser = QuickServerXmlParser.parse(new File(home, "conf/server.xml")); + final String remoteEjb = System.getProperty(Context.PROVIDER_URL, "http://" + parser.host() + ":" + parser.http() + "/tomee/ejb"); + + try { + instance = new RemoteTomEEEJBContainer(); + instance.container = new RemoteServer(); + instance.container.setPortStartup(Integer.parseInt(parser.http())); + + try { + instance.container.start(); + } catch (final Exception e) { + instance.container.destroy(); + throw e; + } + + instance.context = new InitialContext(new Properties() {{ + setProperty(Context.INITIAL_CONTEXT_FACTORY, RemoteInitialContextFactory.class.getName()); + setProperty(Context.PROVIDER_URL, remoteEjb); + }}); + + final Deployer deployer = Deployer.class.cast(instance.context.lookup("openejb/DeployerBusinessRemote")); + + if (modules instanceof File) { + final File file = File.class.cast(modules); + deployFile(deployer, file); + } else if (modules instanceof String) { + final String path = String.class.cast(modules); + final File file = new File(path); + deployFile(deployer, file); + } else if (modules instanceof String[]) { + for (final String path : (String[]) modules) { + deployFile(deployer, new File(path)); + } + } else if (modules instanceof File[]) { + for (final File file : (File[]) modules) { + deployFile(deployer, file); + } + } // else suppose already deployed + + return instance; + } catch (final OpenEJBException e) { + throw new EJBException(e); + } catch (final MalformedURLException e) { + throw new EJBException(e); + } catch (final ValidationException ve) { + throw ve; + } catch (final Exception e) { + if (e instanceof EJBException) { + throw (EJBException) e; + } + throw new TomEERemoteEJBContainerException("initialization exception", e); + } + } + } + + private static void deployFile(final Deployer deployer, final File file) throws IOException, OpenEJBException { + if ("true".equalsIgnoreCase(System.getProperty(DeployerEjb.OPENEJB_USE_BINARIES, "false"))) { + final Properties props = new Properties(); + final byte[] slurpBinaries = IO.slurp(file).getBytes(); + props.put(DeployerEjb.OPENEJB_VALUE_BINARIES, slurpBinaries); + props.put(DeployerEjb.OPENEJB_PATH_BINARIES, file.getName()); + deployer.deploy(file.getAbsolutePath(), props); + } else { + deployer.deploy(file.getAbsolutePath()); + } + } + + protected static class TomEERemoteEJBContainerException extends RuntimeException { + protected TomEERemoteEJBContainerException(final String s, final Exception e) { + super(s, e); + } + } +} http://git-wip-us.apache.org/repos/asf/tomee/blob/7e07f10b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContext.java ---------------------------------------------------------------------- diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContext.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContext.java index 4e7703f..8458672 100644 --- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContext.java +++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContext.java @@ -40,6 +40,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public Object lookup(final Name name) throws NamingException { return getThreadContext().lookup(name); } @@ -47,6 +48,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public Object lookup(final String name) throws NamingException { return getThreadContext().lookup(name); } @@ -54,6 +56,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public void bind(final Name name, final Object obj) throws NamingException { getThreadContext().bind(name, obj); } @@ -61,6 +64,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public void bind(final String name, final Object obj) throws NamingException { getThreadContext().bind(name, obj); } @@ -68,6 +72,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public void rebind(final Name name, final Object obj) throws NamingException { getThreadContext().rebind(name, obj); } @@ -75,6 +80,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public void rebind(final String name, final Object obj) throws NamingException { getThreadContext().rebind(name, obj); } @@ -82,6 +88,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public void unbind(final Name name) throws NamingException { getThreadContext().unbind(name); } @@ -89,6 +96,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public void unbind(final String name) throws NamingException { getThreadContext().unbind(name); } @@ -96,6 +104,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public void rename(final Name oldName, final Name newName) throws NamingException { getThreadContext().rename(oldName, newName); } @@ -103,6 +112,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public void rename(final String oldName, final String newName) throws NamingException { getThreadContext().rename(oldName, newName); } @@ -110,6 +120,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public NamingEnumeration<NameClassPair> list(final Name name) throws NamingException { return getThreadContext().list(name); } @@ -117,6 +128,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public NamingEnumeration<NameClassPair> list(final String name) throws NamingException { return getThreadContext().list(name); } @@ -124,6 +136,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public NamingEnumeration<Binding> listBindings(final Name name) throws NamingException { return getThreadContext().listBindings(name); } @@ -131,6 +144,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public NamingEnumeration<Binding> listBindings(final String name) throws NamingException { return getThreadContext().listBindings(name); } @@ -138,6 +152,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public void destroySubcontext(final Name name) throws NamingException { getThreadContext().destroySubcontext(name); } @@ -145,6 +160,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public void destroySubcontext(final String name) throws NamingException { getThreadContext().destroySubcontext(name); } @@ -152,6 +168,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public Context createSubcontext(final Name name) throws NamingException { return getThreadContext().createSubcontext(name); } @@ -159,6 +176,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public Context createSubcontext(final String name) throws NamingException { return getThreadContext().createSubcontext(name); } @@ -166,6 +184,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public Object lookupLink(final Name name) throws NamingException { return getThreadContext().lookupLink(name); } @@ -173,6 +192,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public Object lookupLink(final String name) throws NamingException { return getThreadContext().lookupLink(name); } @@ -180,6 +200,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public NameParser getNameParser(final Name name) throws NamingException { return getThreadContext().getNameParser(name); } @@ -187,6 +208,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public NameParser getNameParser(final String name) throws NamingException { return getThreadContext().getNameParser(name); } @@ -194,6 +216,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public Name composeName(final Name name, final Name prefix) throws NamingException { return getThreadContext().composeName(name, prefix); } @@ -201,6 +224,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public String composeName(final String name, final String prefix) throws NamingException { return getThreadContext().composeName(name, prefix); } @@ -208,6 +232,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public Object addToEnvironment(final String propName, final Object propVal) throws NamingException { return getThreadContext().addToEnvironment(propName, propVal); } @@ -215,6 +240,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public Object removeFromEnvironment(final String propName) throws NamingException { return getThreadContext().removeFromEnvironment(propName); } @@ -222,6 +248,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public Hashtable<?, ?> getEnvironment() throws NamingException { return getThreadContext().getEnvironment(); } @@ -229,6 +256,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public void close() throws NamingException { getThreadContext().close(); } @@ -236,6 +264,7 @@ public class OpenEJBContext implements Context { /** * {@inheritDoc} */ + @Override public String getNameInNamespace() throws NamingException { return ""; } @@ -251,8 +280,7 @@ public class OpenEJBContext implements Context { if (skipEjbContext(threadContext)) { return ContextBindings.getClassLoader(); } - final Context context = threadContext.getBeanContext().getJndiEnc(); - return context; + return threadContext.getBeanContext().getJndiEnc(); } private boolean skipEjbContext(final ThreadContext threadContext) { @@ -262,5 +290,15 @@ public class OpenEJBContext implements Context { return threadContext == null || DeployerEjb.class.equals(threadContext.getBeanContext().getBeanClass()); } + @Override + protected void finalize() throws Throwable { + try { + this.close(); + } catch (final Exception e) { + //no-op + } finally { + super.finalize(); + } + } } http://git-wip-us.apache.org/repos/asf/tomee/blob/7e07f10b/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/EmbeddedTomEEContainer.java ---------------------------------------------------------------------- diff --git a/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/EmbeddedTomEEContainer.java b/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/EmbeddedTomEEContainer.java index 835bb6b..964dd5d 100644 --- a/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/EmbeddedTomEEContainer.java +++ b/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/EmbeddedTomEEContainer.java @@ -57,6 +57,17 @@ public final class EmbeddedTomEEContainer extends EJBContainer { } @Override + protected void finalize() throws Throwable { + try { + this.close(); + } catch (final Exception e) { + //no-op + } finally { + super.finalize(); + } + } + + @Override public void close() { final Collection<Exception> errors = new ArrayList<Exception>(); for (final String id : deployedIds) {