This is an automated email from the ASF dual-hosted git repository. ilgrosso pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/syncope.git
The following commit(s) were added to refs/heads/master by this push: new b6cb9fb1e8 Console: refining connection and resource checks in Topology b6cb9fb1e8 is described below commit b6cb9fb1e875f28964283f03dfa3a77e1f1ee07a Author: Francesco Chicchiriccò <ilgro...@apache.org> AuthorDate: Thu Aug 7 15:57:13 2025 +0200 Console: refining connection and resource checks in Topology --- .../topology/TopologyWebSocketBehavior.java | 88 +++++++++++----------- 1 file changed, 45 insertions(+), 43 deletions(-) diff --git a/client/idm/console/src/main/java/org/apache/syncope/client/console/topology/TopologyWebSocketBehavior.java b/client/idm/console/src/main/java/org/apache/syncope/client/console/topology/TopologyWebSocketBehavior.java index d0cb924209..1c81d023b6 100644 --- a/client/idm/console/src/main/java/org/apache/syncope/client/console/topology/TopologyWebSocketBehavior.java +++ b/client/idm/console/src/main/java/org/apache/syncope/client/console/topology/TopologyWebSocketBehavior.java @@ -26,6 +26,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; @@ -42,6 +43,7 @@ import org.apache.wicket.protocol.ws.api.message.TextMessage; import org.apache.wicket.spring.injection.annot.SpringBean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.core.task.SimpleAsyncTaskExecutor; public class TopologyWebSocketBehavior extends WebSocketBehavior { @@ -55,38 +57,6 @@ public class TopologyWebSocketBehavior extends WebSocketBehavior { protected static final String RESOURCE_TEST_TIMEOUT_PARAMETER = "resource.test.timeout"; - protected static void timeoutHandlingConnectionChecker( - final Checker checker, - final Integer timeout, - final Map<String, String> responses, - final Set<String> running) { - - String response = null; - try { - if (timeout == null || timeout < 0) { - LOG.debug("No timeouts for resource connection checking ... "); - response = checker.call(); - } else if (timeout > 0) { - LOG.debug("Timeouts provided for resource connection checking ... "); - response = SyncopeConsoleSession.get().execute(checker).get(timeout, TimeUnit.SECONDS); - } - } catch (InterruptedException | TimeoutException e) { - LOG.warn("Connection with {} timed out", checker.key); - response = String.format("{ \"status\": \"%s\", \"target\": \"%s\"}", - TopologyNode.Status.UNREACHABLE, checker.key); - } catch (Exception e) { - LOG.error("Unexpected exception connecting to {}", checker.key, e); - response = String.format("{ \"status\": \"%s\", \"target\": \"%s\"}", - TopologyNode.Status.FAILURE, checker.key); - } - - if (response != null) { - responses.put(checker.key, response); - } - - running.remove(checker.key); - } - @SpringBean protected ServiceOps serviceOps; @@ -107,6 +77,8 @@ public class TopologyWebSocketBehavior extends WebSocketBehavior { protected final Set<String> runningResCheck = Collections.synchronizedSet(new HashSet<>()); + protected final transient SimpleAsyncTaskExecutor executor = new SimpleAsyncTaskExecutor(); + protected String coreAddress; protected String domain; @@ -118,6 +90,8 @@ public class TopologyWebSocketBehavior extends WebSocketBehavior { protected Integer resourceTestTimeout = null; public TopologyWebSocketBehavior() { + executor.setVirtualThreads(true); + coreAddress = serviceOps.get(NetworkService.Type.CORE).getAddress(); domain = SyncopeConsoleSession.get().getDomain(); jwt = SyncopeConsoleSession.get().getJWT(); @@ -132,6 +106,36 @@ public class TopologyWebSocketBehavior extends WebSocketBehavior { } } + protected void timeoutHandlingConnectionChecker( + final Checker checker, + final Integer timeout, + final Map<String, String> responses, + final Set<String> running) { + + String response; + try { + if (timeout == null || timeout < 0) { + LOG.debug("No timeouts for resource connection checking ... "); + response = checker.call(); + } else { + LOG.debug("Timeouts provided for resource connection checking ... "); + response = executor.submit(checker).get(timeout, TimeUnit.SECONDS); + } + } catch (InterruptedException | TimeoutException e) { + LOG.warn("Connection with {} timed out", checker.key); + response = String.format("{ \"status\": \"%s\", \"target\": \"%s\"}", + TopologyNode.Status.UNREACHABLE, checker.key); + } catch (Exception e) { + LOG.error("Unexpected exception connecting to {}", checker.key, e); + response = String.format("{ \"status\": \"%s\", \"target\": \"%s\"}", + TopologyNode.Status.FAILURE, checker.key); + } + + Optional.ofNullable(response).ifPresent(r -> responses.put(checker.key, r)); + + running.remove(checker.key); + } + @Override protected void onMessage(final WebSocketRequestHandler handler, final TextMessage message) { try { @@ -151,8 +155,8 @@ public class TopologyWebSocketBehavior extends WebSocketBehavior { LOG.debug("Running connection check for connector {}", ckey); } else { try { - SyncopeConsoleSession.get().execute(() -> timeoutHandlingConnectionChecker( - new ConnectorChecker(ckey), connectorTestTimeout, connectors, runningConnCheck)); + timeoutHandlingConnectionChecker( + new ConnectorChecker(ckey), connectorTestTimeout, connectors, runningConnCheck); runningConnCheck.add(ckey); } catch (Exception e) { @@ -175,8 +179,8 @@ public class TopologyWebSocketBehavior extends WebSocketBehavior { LOG.debug("Running connection check for resource {}", rkey); } else { try { - SyncopeConsoleSession.get().execute(() -> timeoutHandlingConnectionChecker( - new ResourceChecker(rkey), resourceTestTimeout, resources, runningResCheck)); + timeoutHandlingConnectionChecker( + new ResourceChecker(rkey), resourceTestTimeout, resources, runningResCheck); runningResCheck.add(rkey); } catch (Exception e) { @@ -207,7 +211,7 @@ public class TopologyWebSocketBehavior extends WebSocketBehavior { return this.resources.keySet().containsAll(resources); } - private abstract class Checker implements Callable<String> { + protected abstract class Checker implements Callable<String> { protected final String key; @@ -216,7 +220,7 @@ public class TopologyWebSocketBehavior extends WebSocketBehavior { } } - private class ConnectorChecker extends Checker { + protected class ConnectorChecker extends Checker { ConnectorChecker(final String key) { super(key); @@ -230,13 +234,12 @@ public class TopologyWebSocketBehavior extends WebSocketBehavior { ? TopologyNode.Status.REACHABLE : TopologyNode.Status.UNREACHABLE, key); } catch (Exception e) { LOG.warn("Error checking connection for {}", key, e); - return String.format("{ \"status\": \"%s\", \"target\": \"%s\"}", - TopologyNode.Status.FAILURE, key); + return String.format("{ \"status\": \"%s\", \"target\": \"%s\"}", TopologyNode.Status.FAILURE, key); } } } - private class ResourceChecker extends Checker { + protected class ResourceChecker extends Checker { ResourceChecker(final String key) { super(key); @@ -250,8 +253,7 @@ public class TopologyWebSocketBehavior extends WebSocketBehavior { ? TopologyNode.Status.REACHABLE : TopologyNode.Status.UNREACHABLE, key); } catch (Exception e) { LOG.warn("Error checking connection for {}", key, e); - return String.format("{ \"status\": \"%s\", \"target\": \"%s\"}", - TopologyNode.Status.FAILURE, key); + return String.format("{ \"status\": \"%s\", \"target\": \"%s\"}", TopologyNode.Status.FAILURE, key); } } }