diff --git a/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/SpringBootApp.java b/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/SpringBootApp.java index e06df0fd4..435ec7457 100644 --- a/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/SpringBootApp.java +++ b/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/SpringBootApp.java @@ -14,6 +14,7 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map.Entry; @@ -61,7 +62,7 @@ public class SpringBootApp { private VirtualMachineDescriptor vmd; private Supplier jmxConnect; - private static final Cache pidToJmxConnectUrl = CacheBuilder.newBuilder().build(); + private static final Cache pidToJmxConnectUrl = CacheBuilder.newBuilder().build(); private static Callable> cached(Callable> provider) { LoadingCache>> cache = CacheBuilder.newBuilder() @@ -102,6 +103,12 @@ public class SpringBootApp { for (VirtualMachineDescriptor vmd : list) { apps.add(new SpringBootApp(vmd)); } + + // Invalidate part of pidToJmxConnectUrl cache to remove old processes + Set oldProcesses = new HashSet<>(pidToJmxConnectUrl.asMap().keySet()); + oldProcesses.removeAll(list); + pidToJmxConnectUrl.invalidateAll(oldProcesses); + return apps.build(); } @@ -134,9 +141,10 @@ public class SpringBootApp { } private String getJmxConnectUrl() { - String pid = getProcessID(); try { - return pidToJmxConnectUrl.get(pid, () -> vm.startLocalManagementAgent()); + return pidToJmxConnectUrl.get(vmd, () -> { + return vm.startLocalManagementAgent(); + }); } catch (ExecutionException e) { Log.log(e); return null;