This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository observe. See https://gitlab.nuiton.org/codelutin/observe.git commit 0f58afb1b8a5ec5d3955467eda60028be7ab92d1 Author: Tony CHEMIT <dev@tchemit.fr> Date: Wed Jan 18 20:08:59 2017 +0100 Le serveur ouvre une quantité astronomique de connexions (Fixes #8969) --- application-web/pom.xml | 6 ++- .../controller/v1/DataSourceServiceController.java | 12 ++++-- pom.xml | 2 +- .../ObserveTopiaApplicationContextFactory.java | 46 +++++++++++++++++----- 4 files changed, 52 insertions(+), 14 deletions(-) diff --git a/application-web/pom.xml b/application-web/pom.xml index 748ba43..54e3e29 100644 --- a/application-web/pom.xml +++ b/application-web/pom.xml @@ -81,7 +81,11 @@ <artifactId>application-web-configuration</artifactId> <version>${project.version}</version> </dependency> - + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>services-topia</artifactId> + <version>${project.version}</version> + </dependency> <!-- commons dependencies --> <dependency> diff --git a/application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java b/application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java index 23798d9..c78c1d8 100644 --- a/application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java +++ b/application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java @@ -4,7 +4,7 @@ package fr.ird.observe.application.web.controller.v1; * #%L * ObServe :: Application Web * %% - * Copyright (C) 2008 - 2017 IRD, Code Lutin, Tony Chemit + * Copyright (C) 2008 - 2016 IRD, Codelutin, Tony Chemit * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -41,10 +41,12 @@ import fr.ird.observe.services.service.DataSourceService; import fr.ird.observe.services.service.DatabaseConnexionNotAuthorizedException; import fr.ird.observe.services.service.DatabaseDestroyNotAuthorizedException; import fr.ird.observe.services.service.DatabaseNotFoundException; +import fr.ird.observe.services.topia.ObserveTopiaApplicationContextFactory; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.io.File; +import java.util.LinkedHashSet; import java.util.Optional; import java.util.Set; @@ -99,8 +101,6 @@ public class DataSourceServiceController extends ObserveServiceControllerSupport @Override public void close() { - getAuthenticatedService().close(); - ObserveWebRequestContext requestContext = getRequestContext(); String authenticationToken = requestContext.getAuthenticationToken(); getSecurityApplicationContext().invalidateAuthenticationToken(authenticationToken); @@ -108,6 +108,12 @@ public class DataSourceServiceController extends ObserveServiceControllerSupport log.info("Invalidate authenticationToken: " + authenticationToken); } + Set<String> databaseAuthenticationTokens = new LinkedHashSet<>(); + for (ObserveDataSourceConfigurationAndConnection connection : getSecurityApplicationContext().getConfigurationByAuthenticationToken().values()) { + databaseAuthenticationTokens.add(connection.getConnection().getAuthenticationToken()); + } + + ObserveTopiaApplicationContextFactory.clearContexts(databaseAuthenticationTokens); } @Override diff --git a/pom.xml b/pom.xml index 9e01755..91473f5 100644 --- a/pom.xml +++ b/pom.xml @@ -157,7 +157,7 @@ <eugenePluginVersion>3.0-alpha-10</eugenePluginVersion> <processorPluginVersion>1.3</processorPluginVersion> - <topiaVersion>3.2</topiaVersion> + <topiaVersion>3.2.1</topiaVersion> <jaxxVersion>3.0-alpha-3</jaxxVersion> <nuitonI18nVersion>3.6.2</nuitonI18nVersion> <nuitonValidatorVersion>3.1</nuitonValidatorVersion> diff --git a/services-topia/src/main/java/fr/ird/observe/services/topia/ObserveTopiaApplicationContextFactory.java b/services-topia/src/main/java/fr/ird/observe/services/topia/ObserveTopiaApplicationContextFactory.java index 83dff4f..c41efc5 100644 --- a/services-topia/src/main/java/fr/ird/observe/services/topia/ObserveTopiaApplicationContextFactory.java +++ b/services-topia/src/main/java/fr/ird/observe/services/topia/ObserveTopiaApplicationContextFactory.java @@ -38,6 +38,8 @@ import java.util.LinkedHashSet; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; /** * Usine de contexte applicatif ToPIA. @@ -101,25 +103,51 @@ public class ObserveTopiaApplicationContextFactory { } + public static void clearContexts(Set<String> usedTokens) { + + Set<ObserveDataSourceConfigurationTopiaSupport> unusedConfigurations = TOPIA_APPLICATION_CONTEXT_CACHE.entrySet() + .stream() + .filter(e -> !usedTokens.contains(e.getValue().getAuthenticationToken())) + .map(Map.Entry::getKey) + .collect(Collectors.toSet()); + for (ObserveDataSourceConfigurationTopiaSupport unusedConfiguration : unusedConfigurations) { + + ObserveTopiaApplicationContext topiaApplicationContext = TOPIA_APPLICATION_CONTEXT_CACHE.get(unusedConfiguration); + if (log.isInfoEnabled()) { + log.info("Remove unsued topia application context for: " + unusedConfiguration); + } + close(topiaApplicationContext); + TOPIA_APPLICATION_CONTEXT_CACHE.remove(unusedConfiguration); + } + + if (log.isInfoEnabled()) { + log.info("Still using " + TOPIA_APPLICATION_CONTEXT_CACHE.size() + " topia application context(s)."); + } + } + public static void close() { for (TopiaApplicationContext topiaApplicationContext : new LinkedHashSet<>(TOPIA_APPLICATION_CONTEXT_CACHE.values())) { - if (!topiaApplicationContext.isClosed()) { - try { - topiaApplicationContext.close(); - } catch (Exception e) { - if (log.isErrorEnabled()) { - log.error("Could not close topiaApplicationContext: " + topiaApplicationContext, e); - } - } - } + close(topiaApplicationContext); } TOPIA_APPLICATION_CONTEXT_CACHE.clear(); } + protected static void close(TopiaApplicationContext topiaApplicationContext) { + if (!topiaApplicationContext.isClosed()) { + try { + topiaApplicationContext.close(); + } catch (Exception e) { + if (log.isErrorEnabled()) { + log.error("Could not close topiaApplicationContext: " + topiaApplicationContext, e); + } + } + } + } + public static ObserveTopiaConfiguration createTopiaConfiguration(ObserveDataSourceConfigurationTopiaPG configuration, boolean initSchema) { ObserveTopiaConfiguration topiaConfiguration = ObserveTopiaConfigurationFactory.forPostgresqlDatabase( -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.