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);
             }
         }
     }

Reply via email to