killbill-memoizeit

server: fix shutdown sequence Signed-off-by: Pierre-Alexandre

7/9/2017 11:37:34 AM

Details

diff --git a/profiles/killbill/pom.xml b/profiles/killbill/pom.xml
index c59a4cd..97d679a 100644
--- a/profiles/killbill/pom.xml
+++ b/profiles/killbill/pom.xml
@@ -179,6 +179,10 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>org.bgee.log4jdbc-log4j2</groupId>
+            <artifactId>log4jdbc-log4j2-jdbc4</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.codehaus.janino</groupId>
             <artifactId>janino</artifactId>
             <scope>runtime</scope>
diff --git a/profiles/killbill/src/main/java/org/killbill/billing/server/listeners/CleanupListener.java b/profiles/killbill/src/main/java/org/killbill/billing/server/listeners/CleanupListener.java
index 902ba81..d79edbe 100644
--- a/profiles/killbill/src/main/java/org/killbill/billing/server/listeners/CleanupListener.java
+++ b/profiles/killbill/src/main/java/org/killbill/billing/server/listeners/CleanupListener.java
@@ -28,6 +28,8 @@ import javax.servlet.ServletContextListener;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import net.sf.log4jdbc.sql.jdbcapi.DriverSpy;
+
 public class CleanupListener implements ServletContextListener {
 
     private static final Logger logger = LoggerFactory.getLogger(CleanupListener.class);
@@ -38,16 +40,6 @@ public class CleanupListener implements ServletContextListener {
 
     @Override
     public void contextDestroyed(final ServletContextEvent servletContextEvent) {
-        final Enumeration<Driver> drivers = DriverManager.getDrivers();
-        while (drivers.hasMoreElements()) {
-            try {
-                final Driver driver = drivers.nextElement();
-                DriverManager.deregisterDriver(driver);
-            } catch (final SQLException e) {
-                logger.warn("Unable to de-register driver", e);
-            }
-        }
-
         // See http://docs.oracle.com/cd/E17952_01/connector-j-relnotes-en/news-5-1-23.html
         try {
             Class.forName("com.mysql.jdbc.AbandonedConnectionCleanupThread");
@@ -65,5 +57,23 @@ public class CleanupListener implements ServletContextListener {
         } catch (final ClassNotFoundException ignored) {
             // MariaDB driver not used
         }
+
+        try {
+            // Invoke DriverSpy directly if it hasn't been already, as it will statically load drivers
+            DriverManager.deregisterDriver(new DriverSpy());
+        } catch (final SQLException e) {
+            logger.warn("Unable to de-register driver", e);
+        }
+
+        // This needs to be last, as drivers above will invoke registerDriver statically
+        final Enumeration<Driver> drivers = DriverManager.getDrivers();
+        while (drivers.hasMoreElements()) {
+            try {
+                final Driver driver = drivers.nextElement();
+                DriverManager.deregisterDriver(driver);
+            } catch (final SQLException e) {
+                logger.warn("Unable to de-register driver", e);
+            }
+        }
     }
 }
diff --git a/profiles/killbill/src/main/java/org/killbill/billing/server/listeners/KillbillGuiceListener.java b/profiles/killbill/src/main/java/org/killbill/billing/server/listeners/KillbillGuiceListener.java
index 79838b1..0fcb600 100644
--- a/profiles/killbill/src/main/java/org/killbill/billing/server/listeners/KillbillGuiceListener.java
+++ b/profiles/killbill/src/main/java/org/killbill/billing/server/listeners/KillbillGuiceListener.java
@@ -32,6 +32,7 @@ import org.killbill.billing.server.filters.ProfilingContainerResponseFilter;
 import org.killbill.billing.server.filters.RequestDataFilter;
 import org.killbill.billing.server.filters.ResponseCorsFilter;
 import org.killbill.billing.server.modules.KillbillServerModule;
+import org.killbill.billing.server.notifications.PushNotificationListener;
 import org.killbill.billing.server.security.TenantFilter;
 import org.killbill.bus.api.PersistentBus;
 import org.killbill.commons.skeleton.modules.BaseServerModuleBuilder;
@@ -127,6 +128,8 @@ public class KillbillGuiceListener extends KillbillPlatformGuiceListener {
 
     @Override
     protected void stopLifecycleStage2() {
+        super.stopLifecycleStage2();
+
         try {
             killbillBusService.getBus().unregister(killbilleventHandler);
         } catch (final PersistentBus.EventBusException e) {
@@ -147,4 +150,12 @@ public class KillbillGuiceListener extends KillbillPlatformGuiceListener {
         beanConfig.setLicenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html");
         beanConfig.setScan(true);
     }
+
+    @Override
+    protected void stopLifecycleStage3() {
+        super.stopLifecycleStage3();
+
+        final PushNotificationListener pushNotificationListener = injector.getInstance(PushNotificationListener.class);
+        pushNotificationListener.shutdown();
+    }
 }
diff --git a/profiles/killbill/src/main/java/org/killbill/billing/server/modules/KillbillServerModule.java b/profiles/killbill/src/main/java/org/killbill/billing/server/modules/KillbillServerModule.java
index b2b0c49..0e1627d 100644
--- a/profiles/killbill/src/main/java/org/killbill/billing/server/modules/KillbillServerModule.java
+++ b/profiles/killbill/src/main/java/org/killbill/billing/server/modules/KillbillServerModule.java
@@ -132,9 +132,13 @@ public class KillbillServerModule extends KillbillPlatformModule {
     }
 
     @Override
-    protected void configureEmbeddedDB() {
-        embeddedDB = new KillBillEmbeddedDBProvider(daoConfig).get();
-        bind(EmbeddedDB.class).toInstance(embeddedDB);
+    protected void configureEmbeddedDBs() {
+        mainEmbeddedDB = new KillBillEmbeddedDBProvider(daoConfig).get();
+        bind(EmbeddedDB.class).toInstance(mainEmbeddedDB);
+
+        // Same database, but different pool: clone the object so the shutdown sequence cleans the pool properly
+        shiroEmbeddedDB = new KillBillEmbeddedDBProvider(daoConfig).get();
+        bind(EmbeddedDB.class).annotatedWith(Names.named(SHIRO_DATA_SOURCE_ID_NAMED)).toInstance(shiroEmbeddedDB);
     }
 
     @Override
diff --git a/profiles/killbill/src/main/java/org/killbill/billing/server/notifications/PushNotificationListener.java b/profiles/killbill/src/main/java/org/killbill/billing/server/notifications/PushNotificationListener.java
index afa18cf..0f35812 100644
--- a/profiles/killbill/src/main/java/org/killbill/billing/server/notifications/PushNotificationListener.java
+++ b/profiles/killbill/src/main/java/org/killbill/billing/server/notifications/PushNotificationListener.java
@@ -113,6 +113,10 @@ public class PushNotificationListener {
         }
     }
 
+    public void shutdown() {
+        httpClient.close();
+    }
+
     private void dispatchCallback(final UUID tenantId, final ExtBusEvent event, final Iterable<String> callbacks) throws IOException {
         final NotificationJson notification = new NotificationJson(event);
         final String body = mapper.writeValueAsString(notification);