Fix JMX related resource leak

JMX connections on language server not closed when stopping
the last/only tunneled boot dash app.
This commit is contained in:
Kris De Volder
2018-08-09 13:58:48 -07:00
parent 3b0fb2135a
commit a42340c593
2 changed files with 23 additions and 29 deletions

View File

@@ -18,7 +18,6 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import java.util.Optional;
import java.util.Properties;
import java.util.Set;
@@ -39,19 +38,15 @@ import org.springframework.ide.vscode.commons.boot.app.cli.livebean.LiveBeansMod
import org.springframework.ide.vscode.commons.boot.app.cli.requestmappings.Boot1xRequestMapping;
import org.springframework.ide.vscode.commons.boot.app.cli.requestmappings.RequestMapping;
import org.springframework.ide.vscode.commons.boot.app.cli.requestmappings.RequestMappingsParser20;
import org.springframework.ide.vscode.commons.util.MemoizingDisposableSupplier;
import org.springframework.ide.vscode.commons.util.ExceptionUtil;
import org.springframework.ide.vscode.commons.util.FuctionWithException;
import org.springframework.ide.vscode.commons.util.FunctionWithException;
import org.springframework.ide.vscode.commons.util.MemoizingDisposableSupplier;
import org.springframework.ide.vscode.commons.util.StringUtil;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import com.google.common.collect.ImmutableList;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.sun.jdi.connect.Connector;
/**
* A abstract base class which attempts to capture commonalities between

View File

@@ -21,7 +21,6 @@ import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ide.vscode.boot.java.handlers.RemoteRunningAppsProvider.RemoteBootAppData;
import org.springframework.ide.vscode.commons.boot.app.cli.RemoteSpringBootApp;
import org.springframework.ide.vscode.commons.boot.app.cli.SpringBootApp;
import org.springframework.ide.vscode.commons.languageserver.util.Settings;
@@ -102,31 +101,31 @@ public class RemoteRunningAppsProvider implements RunningAppProvider {
synchronized void handleSettings(Settings settings) {
RemoteBootAppData[] appData = settings.getAs(RemoteBootAppData[].class, "boot-java", "remote-apps");
if (appData==null || appData.length==0) {
logger.info("Clearing all RemoteSpringBootApps");
remoteAppInstances.clear();
} else {
Set<RemoteBootAppData> newAppData = new HashSet<>(Arrays.asList(appData));
{ //Remove obsolete apps...
Iterator<Entry<RemoteBootAppData, SpringBootApp>> entries = remoteAppInstances.entrySet().iterator();
while (entries.hasNext()) {
Entry<RemoteBootAppData, SpringBootApp> entry = entries.next();
RemoteBootAppData key = entry.getKey();
if (!newAppData.contains(key)) {
logger.info("Removing RemoteSpringBootApp: "+key);
entries.remove();
entry.getValue().dispose();
}
if (appData==null) {
//Avoid NPE
appData = new RemoteBootAppData[0];
}
Set<RemoteBootAppData> newAppData = new HashSet<>(Arrays.asList(appData));
{ //Remove obsolete apps
Iterator<Entry<RemoteBootAppData, SpringBootApp>> entries = remoteAppInstances.entrySet().iterator();
while (entries.hasNext()) {
Entry<RemoteBootAppData, SpringBootApp> entry = entries.next();
RemoteBootAppData key = entry.getKey();
if (!newAppData.contains(key)) {
logger.info("Removing RemoteSpringBootApp: "+key);
entries.remove();
entry.getValue().dispose();
}
}
}
{ //Add new apps
for (RemoteBootAppData key : newAppData) {
remoteAppInstances.computeIfAbsent(key, (_key) -> {
logger.info("Creating RemoteStringBootApp: "+_key);
return RemoteSpringBootApp.create(key.getJmxurl(), key.getHost());
});
}
{ //Add new apps
for (RemoteBootAppData key : newAppData) {
remoteAppInstances.computeIfAbsent(key, (_key) -> {
logger.info("Creating RemoteStringBootApp: "+_key);
return RemoteSpringBootApp.create(key.getJmxurl(), key.getHost());
});
}
}
}