This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 051778fe77f camel-core - Reload console should be able to wait for 
reloading and report status back
051778fe77f is described below

commit 051778fe77f24a0bd4a86b0fef95e17c277da12f
Author: Claus Ibsen <[email protected]>
AuthorDate: Wed Aug 28 09:35:03 2024 +0200

    camel-core - Reload console should be able to wait for reloading and report 
status back
---
 .../camel/impl/console/ReloadDevConsole.java       | 64 +++++++++++++++++++---
 1 file changed, 57 insertions(+), 7 deletions(-)

diff --git 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/ReloadDevConsole.java
 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/ReloadDevConsole.java
index 8d82525d202..4c899caccb4 100644
--- 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/ReloadDevConsole.java
+++ 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/ReloadDevConsole.java
@@ -19,6 +19,8 @@ package org.apache.camel.impl.console;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
 
 import org.apache.camel.spi.ReloadStrategy;
 import org.apache.camel.spi.annotations.DevConsole;
@@ -34,6 +36,11 @@ public class ReloadDevConsole extends AbstractDevConsole {
      */
     public static final String RELOAD = "reload";
 
+    /**
+     * Option to wait for reloading to complete
+     */
+    public static final String RELOAD_WAIT = "wait";
+
     // reload on demand should run async to avoid blocking
     private volatile ExecutorService reloadThread;
 
@@ -42,33 +49,65 @@ public class ReloadDevConsole extends AbstractDevConsole {
     }
 
     protected String doCallText(Map<String, Object> options) {
-        String trigger = (String) options.get(RELOAD);
+        boolean trigger = "true".equals(options.getOrDefault(RELOAD, "false"));
+        boolean wait = "true".equals(options.getOrDefault(RELOAD_WAIT, 
"false"));
         StringBuilder sb = new StringBuilder();
 
         Set<ReloadStrategy> rs = 
getCamelContext().hasServices(ReloadStrategy.class);
+        boolean failed = false;
         for (ReloadStrategy r : rs) {
-            if ("true".equals(trigger)) {
-                getOrCreateReloadTask().submit(() -> 
r.onReload("ReloadDevConsole"));
+            if (trigger) {
+                int before = r.getFailedCounter();
+                Future<?> f = getOrCreateReloadTask().submit(() -> 
r.onReload("ReloadDevConsole"));
+                if (wait) {
+                    try {
+                        f.get(30, TimeUnit.SECONDS);
+                        failed |= r.getFailedCounter() > before;
+                    } catch (Exception e) {
+                        // ignore
+                    }
+                }
             } else {
                 sb.append(String.format("\nReloadStrategy: %s", 
r.getClass().getName()));
                 sb.append(String.format("\n    Reloaded: %s", 
r.getReloadCounter()));
                 sb.append(String.format("\n    Failed: %s", 
r.getFailedCounter()));
             }
         }
+        if (trigger) {
+            if (wait) {
+                if (failed) {
+                    sb.append("Status: Reload failed");
+                } else {
+                    sb.append("Status: Reload success");
+                }
+            } else {
+                sb.append("Status: Reloading in progress");
+            }
+        }
         sb.append("\n");
-
         return sb.toString();
     }
 
     protected JsonObject doCallJson(Map<String, Object> options) {
-        String trigger = (String) options.get(RELOAD);
+        boolean trigger = "true".equals(options.getOrDefault(RELOAD, "false"));
+        boolean wait = "true".equals(options.getOrDefault(RELOAD_WAIT, 
"false"));
         JsonObject root = new JsonObject();
 
         JsonArray arr = new JsonArray();
         Set<ReloadStrategy> rs = 
getCamelContext().hasServices(ReloadStrategy.class);
+        boolean failed = false;
         for (ReloadStrategy r : rs) {
-            if ("true".equals(trigger)) {
-                getOrCreateReloadTask().submit(() -> 
r.onReload("ReloadDevConsole"));
+            if (trigger) {
+                int before = r.getFailedCounter();
+                Future<?> f = getOrCreateReloadTask().submit(() -> 
r.onReload("ReloadDevConsole"));
+                if (wait) {
+                    try {
+                        f.get(30, TimeUnit.SECONDS);
+                        failed |= r.getFailedCounter() > before;
+                    } catch (Exception e) {
+                        // ignore
+                    }
+                }
             } else {
                 if (root.isEmpty()) {
                     root.put("reloadStrategies", arr);
@@ -81,6 +120,17 @@ public class ReloadDevConsole extends AbstractDevConsole {
             }
         }
 
+        if (trigger) {
+            if (wait) {
+                if (failed) {
+                    root.put("status", "failed");
+                } else {
+                    root.put("status", "success");
+                }
+            } else {
+                root.put("status", "reloading");
+            }
+        }
         return root;
     }
 

Reply via email to