You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2023/05/18 07:56:50 UTC

[camel] branch camel-3.x updated: CAMEL-19366: camel-core - Trigger reload via dev console make it async

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

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


The following commit(s) were added to refs/heads/camel-3.x by this push:
     new 98c3d9d69b1 CAMEL-19366: camel-core - Trigger reload via dev console make it async
98c3d9d69b1 is described below

commit 98c3d9d69b19835b3aa37890388220b4e131b4b2
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu May 18 09:56:19 2023 +0200

    CAMEL-19366: camel-core - Trigger reload via dev console make it async
---
 .../camel/impl/console/ReloadDevConsole.java       | 44 ++++++++++++++++------
 1 file changed, 33 insertions(+), 11 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 3133e8a7d63..e512151128a 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
@@ -18,6 +18,7 @@ package org.apache.camel.impl.console;
 
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ExecutorService;
 
 import org.apache.camel.spi.ReloadStrategy;
 import org.apache.camel.spi.annotations.DevConsole;
@@ -28,6 +29,9 @@ import org.apache.camel.util.json.JsonObject;
 @DevConsole("reload")
 public class ReloadDevConsole extends AbstractDevConsole {
 
+    // reload on demand should run async to avoid blocking
+    private volatile ExecutorService reloadThread;
+
     /**
      * Option to trigger reloading
      */
@@ -44,11 +48,12 @@ public class ReloadDevConsole extends AbstractDevConsole {
         Set<ReloadStrategy> rs = getCamelContext().hasServices(ReloadStrategy.class);
         for (ReloadStrategy r : rs) {
             if ("true".equals(trigger)) {
-                r.onReload("ReloadDevConsole");
+                getOrCreateReloadTask().submit(() -> r.onReload("ReloadDevConsole"));
+            } 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()));
             }
-            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()));
         }
         sb.append("\n");
 
@@ -60,20 +65,37 @@ public class ReloadDevConsole extends AbstractDevConsole {
         JsonObject root = new JsonObject();
 
         JsonArray arr = new JsonArray();
-        root.put("reloadStrategies", arr);
         Set<ReloadStrategy> rs = getCamelContext().hasServices(ReloadStrategy.class);
         for (ReloadStrategy r : rs) {
             if ("true".equals(trigger)) {
-                r.onReload("ReloadDevConsole");
+                getOrCreateReloadTask().submit(() -> r.onReload("ReloadDevConsole"));
+            } else {
+                if (root.isEmpty()) {
+                    root.put("reloadStrategies", arr);
+                }
+                JsonObject jo = new JsonObject();
+                arr.add(jo);
+                jo.put("className", r.getClass().getName());
+                jo.put("reloaded", r.getReloadCounter());
+                jo.put("failed", r.getFailedCounter());
             }
-            JsonObject jo = new JsonObject();
-            arr.add(jo);
-            jo.put("className", r.getClass().getName());
-            jo.put("reloadCounter", r.getReloadCounter());
-            jo.put("failedCounter", r.getFailedCounter());
         }
 
         return root;
     }
 
+    protected ExecutorService getOrCreateReloadTask() {
+        if (reloadThread == null) {
+            reloadThread = getCamelContext().getExecutorServiceManager().newSingleThreadExecutor(this, "ReloadOnDemand");
+        }
+        return reloadThread;
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        if (reloadThread != null) {
+            getCamelContext().getExecutorServiceManager().shutdown(reloadThread);
+            reloadThread = null;
+        }
+    }
 }