Fix boot ls server hang

It was caused by a forever blocking call to RMIConnector.close() for
a tunnelled JMX connection to a remote app that is no longer
there (stopped).
This commit is contained in:
Kris De Volder
2018-11-29 17:21:02 -08:00
parent 70c7305377
commit 6528b988d2
2 changed files with 14 additions and 15 deletions

View File

@@ -14,6 +14,7 @@ import java.io.File;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.lang.management.PlatformManagedObject;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
@@ -22,6 +23,7 @@ import java.util.Optional;
import java.util.Properties;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
import javax.management.InstanceNotFoundException;
@@ -40,6 +42,7 @@ 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.AsyncRunner;
import org.springframework.ide.vscode.commons.util.ExceptionUtil;
import org.springframework.ide.vscode.commons.util.FuctionWithException;
import org.springframework.ide.vscode.commons.util.FunctionWithException;
@@ -52,12 +55,19 @@ import com.google.common.collect.ImmutableList;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import reactor.core.scheduler.Schedulers;
/**
* A abstract base class which attempts to capture commonalities between
* Local and Remote connections to SpringBootApp using JMX.
*/
public abstract class AbstractSpringBootApp implements SpringBootApp {
protected static AsyncRunner async = new AsyncRunner(Schedulers.elastic());
private static final Duration TIMEOUT = Duration.ofMillis(1000);
protected static <T> T withTimeout(Callable<T> doit) throws Exception {
return async.invoke(TIMEOUT, doit).get();
}
private static final String SPRINGFRAMEWORK_BOOT_DOMAIN = "org.springframework.boot";
protected static Logger logger = LoggerFactory.getLogger(SpringBootApp.class);
@@ -112,12 +122,11 @@ public abstract class AbstractSpringBootApp implements SpringBootApp {
},
//disposing jmx connector:
(connector) -> {
try {
logger.info("Disposing JMX connector: "+connector);
logger.info("Disposing JMX connector: "+connector);
AsyncRunner.thenLog(logger, async.invoke(TIMEOUT, () -> {
connector.close();
} catch (IOException e) {
//ignore
}
return "done";
}));
}
);

View File

@@ -19,7 +19,6 @@ import java.util.concurrent.Callable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ide.vscode.commons.util.AsyncRunner;
import org.springframework.ide.vscode.commons.util.CollectorUtil;
import org.springframework.ide.vscode.commons.util.ExceptionUtil;
@@ -27,8 +26,6 @@ import com.sun.tools.attach.AttachNotSupportedException;
import com.sun.tools.attach.VirtualMachine;
import com.sun.tools.attach.VirtualMachineDescriptor;
import reactor.core.scheduler.Schedulers;
/**
* @author Martin Lippert
*/
@@ -36,18 +33,11 @@ public class LocalSpringBootApp extends AbstractSpringBootApp {
private static final Logger logger = LoggerFactory.getLogger(LocalSpringBootApp.class);
private static AsyncRunner async = new AsyncRunner(Schedulers.elastic());
private static <T> T withTimeout(Callable<T> doit) throws Exception {
return async.invoke(TIMEOUT, doit).get();
}
private VirtualMachine vm;
private VirtualMachineDescriptor vmd;
private static final String LOCAL_CONNECTOR_ADDRESS = "com.sun.management.jmxremote.localConnectorAddress";
private static final Duration TIMEOUT = Duration.ofMillis(1000);
private Boolean isSpringBootApp;
private static LocalSpringBootAppCache cache = new LocalSpringBootAppCache();