Repository: tomee Updated Branches: refs/heads/master 549066338 -> eeacfec64
TOMEE-1845 avoid warning when undeploying a dbcp2 datasource Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/eeacfec6 Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/eeacfec6 Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/eeacfec6 Branch: refs/heads/master Commit: eeacfec641dec53e3a02f10af37c1a44f7025196 Parents: 5490663 Author: Romain manni-Bucau <rmannibu...@gmail.com> Authored: Wed Jun 15 17:54:34 2016 +0200 Committer: Romain manni-Bucau <rmannibu...@gmail.com> Committed: Wed Jun 15 17:54:34 2016 +0200 ---------------------------------------------------------------------- .../resource/jdbc/dbcp/BasicDataSource.java | 7 ++ .../jdbc/dbcp/BasicManagedDataSource.java | 9 ++- .../resource/jdbc/dbcp/JMXBasicDataSource.java | 27 +++---- .../tomee/embedded/AppDataSourceTest.java | 78 ++++++++++++++++++++ 4 files changed, 102 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/eeacfec6/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicDataSource.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicDataSource.java b/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicDataSource.java index 37096b3..6255394 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicDataSource.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicDataSource.java @@ -29,6 +29,8 @@ import org.apache.openejb.resource.jdbc.IsolationLevels; import org.apache.openejb.resource.jdbc.plugin.DataSourcePlugin; import org.apache.openejb.util.reflection.Reflections; +import javax.management.MBeanServer; +import javax.management.ObjectName; import javax.sql.CommonDataSource; import javax.sql.DataSource; import javax.sql.XADataSource; @@ -269,6 +271,11 @@ public class BasicDataSource extends org.apache.commons.dbcp2.BasicDataSource im this.name = name; } + @Override + public ObjectName preRegister(final MBeanServer server, final ObjectName name) { + return name; + } + Object writeReplace() throws ObjectStreamException { return new DataSourceSerialization(name); } http://git-wip-us.apache.org/repos/asf/tomee/blob/eeacfec6/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicManagedDataSource.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicManagedDataSource.java b/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicManagedDataSource.java index 0846f21..75bdf19 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicManagedDataSource.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/BasicManagedDataSource.java @@ -28,6 +28,9 @@ import org.apache.openejb.resource.jdbc.plugin.DataSourcePlugin; import org.apache.openejb.resource.jdbc.pool.XADataSourceResource; import org.apache.openejb.util.reflection.Reflections; +import javax.management.MBeanServer; +import javax.management.ObjectName; +import javax.sql.DataSource; import java.io.File; import java.io.ObjectStreamException; import java.io.Serializable; @@ -36,7 +39,6 @@ import java.sql.SQLFeatureNotSupportedException; import java.util.Properties; import java.util.concurrent.locks.ReentrantLock; import java.util.logging.Logger; -import javax.sql.DataSource; @SuppressWarnings({"UnusedDeclaration"}) public class BasicManagedDataSource extends org.apache.commons.dbcp2.managed.BasicManagedDataSource implements Serializable { @@ -341,6 +343,11 @@ public class BasicManagedDataSource extends org.apache.commons.dbcp2.managed.Bas } } + @Override + public ObjectName preRegister(final MBeanServer server, final ObjectName name) { + return name; + } + Object writeReplace() throws ObjectStreamException { return new DataSourceSerialization(name); } http://git-wip-us.apache.org/repos/asf/tomee/blob/eeacfec6/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/JMXBasicDataSource.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/JMXBasicDataSource.java b/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/JMXBasicDataSource.java index d0e6e30..665220a 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/JMXBasicDataSource.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/JMXBasicDataSource.java @@ -26,11 +26,11 @@ import org.apache.openejb.monitoring.DynamicMBeanWrapper; import org.apache.openejb.monitoring.LocalMBeanServer; import org.apache.openejb.monitoring.ObjectNameBuilder; +import javax.management.MBeanServer; +import javax.management.ObjectName; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; -import javax.management.MBeanServer; -import javax.management.ObjectName; // @MBean: don't put it since it is not a pojo @Internal @@ -47,26 +47,17 @@ public class JMXBasicDataSource { if (LocalMBeanServer.isJMXActive()) { objectName = ObjectNameBuilder.uniqueName("datasources", name, ds); final MBeanServer server = LocalMBeanServer.get(); - try { - if (server.isRegistered(objectName)) { - server.unregisterMBean(objectName); - } - server.registerMBean(new DynamicMBeanWrapper(this), objectName); - } catch (final Exception e) { - e.printStackTrace(); // TODO - } + LocalMBeanServer.registerSilently(new DynamicMBeanWrapper(this), objectName); } } public void unregister() { - if (objectName == null) { - return; - } - - try { - LocalMBeanServer.get().unregisterMBean(objectName); - } catch (final Exception e) { - // ignored + if (objectName != null) { + try { + LocalMBeanServer.get().unregisterMBean(objectName); + } catch (final Exception e) { + // ignored + } } } http://git-wip-us.apache.org/repos/asf/tomee/blob/eeacfec6/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/AppDataSourceTest.java ---------------------------------------------------------------------- diff --git a/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/AppDataSourceTest.java b/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/AppDataSourceTest.java new file mode 100644 index 0000000..a874e25 --- /dev/null +++ b/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/AppDataSourceTest.java @@ -0,0 +1,78 @@ +/** + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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.embedded; + +import org.apache.commons.dbcp2.BasicDataSource; +import org.apache.commons.logging.LogFactory; +import org.apache.commons.logging.impl.Jdk14Logger; +import org.apache.openejb.OpenEJBException; +import org.apache.openejb.loader.IO; +import org.junit.Test; + +import javax.naming.NamingException; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.LogRecord; + +import static org.junit.Assert.assertTrue; + +public class AppDataSourceTest { + @Test + public void run() throws OpenEJBException, NamingException, IOException { + final File tempWar = new File("target/AppDataSourceTest"); + tempWar.mkdirs(); + new File(tempWar, "WEB-INF").mkdirs(); + IO.writeString(new File(tempWar, "WEB-INF/resources.xml"), + "<resources>\n" + + "<Resource id=\"java:app/gace/MyDS\" type=\"DataSource\">\n" + + "DataSourceCreator=dbcp\n" + + "</Resource>\n" + + "</resources>\n"); + final Collection<LogRecord> records = new ArrayList<>(); + try (final Container c = new Container(new Configuration().randomHttpPort())) { + Jdk14Logger.class.cast(LogFactory.getLog(BasicDataSource.class)).getLogger().addHandler(new Handler() { + @Override + public void publish(final LogRecord record) { + if (record.getLevel() == Level.SEVERE || record.getLevel() == Level.WARNING) { + records.add(record); + } + } + + @Override + public void flush() { + // no-op + } + + @Override + public void close() throws SecurityException { + // no-op + } + }); + c.deploy(null, tempWar); + } + + // if we have the JMX bug of dbcp2 integration (in 7.0.0) then we have a WARNING record from BasicDataSource.close() + // saying: + // Failed to unregister the JMX name: + // Tomcat:type=DataSource,host=localhost,context=/AppDataSourceTest,class=javax.sql.DataSource,name="openejb/Resource/AppDataSourceTest/app/gace/MyDS" + assertTrue(records.isEmpty()); + } +}