killbill-memoizeit
Changes
profiles/killbill/pom.xml 4(+4 -0)
profiles/killbill/src/main/java/org/killbill/billing/server/listeners/CleanupListener.java 30(+20 -10)
profiles/killbill/src/main/java/org/killbill/billing/server/listeners/KillbillGuiceListener.java 11(+11 -0)
Details
profiles/killbill/pom.xml 4(+4 -0)
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);