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 2016/12/19 15:35:20 UTC

[8/8] camel git commit: CAMEL-10599: Add ReloadStrategy to allow watching for file changes and reload routes on the fly.

CAMEL-10599: Add ReloadStrategy to allow watching for file changes and reload routes on the fly.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/4df16501
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/4df16501
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/4df16501

Branch: refs/heads/master
Commit: 4df165016ce93590f3856af458ab56f68c1c0981
Parents: fbbf829
Author: Claus Ibsen <da...@apache.org>
Authored: Mon Dec 19 15:20:45 2016 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Mon Dec 19 16:34:46 2016 +0100

----------------------------------------------------------------------
 .../mbean/ManagedReloadStrategyMBean.java        |  4 ++++
 .../camel/impl/FileWatcherReloadStrategy.java    | 17 ++++++++++++++---
 .../java/org/apache/camel/main/MainSupport.java  | 19 +++++++++++++++++++
 .../management/mbean/ManagedReloadStrategy.java  |  5 +++++
 .../java/org/apache/camel/model/ModelHelper.java |  9 +++++----
 .../camel/support/ReloadStrategySupport.java     |  7 ++++---
 6 files changed, 51 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/4df16501/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedReloadStrategyMBean.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedReloadStrategyMBean.java b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedReloadStrategyMBean.java
index 80065ce..3154557 100644
--- a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedReloadStrategyMBean.java
+++ b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedReloadStrategyMBean.java
@@ -17,9 +17,13 @@
 package org.apache.camel.api.management.mbean;
 
 import org.apache.camel.api.management.ManagedAttribute;
+import org.apache.camel.api.management.ManagedOperation;
 
 public interface ManagedReloadStrategyMBean extends ManagedServiceMBean {
 
+    @ManagedOperation(description = "Force reload of CamelContext")
+    void forceReloadCamelContext();
+
     @ManagedAttribute(description = "Strategy")
     String getStrategy();
 

http://git-wip-us.apache.org/repos/asf/camel/blob/4df16501/camel-core/src/main/java/org/apache/camel/impl/FileWatcherReloadStrategy.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/impl/FileWatcherReloadStrategy.java b/camel-core/src/main/java/org/apache/camel/impl/FileWatcherReloadStrategy.java
index 3fc3dd1..e80f048 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/FileWatcherReloadStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/FileWatcherReloadStrategy.java
@@ -37,11 +37,14 @@ import org.apache.camel.util.ObjectHelper;
 /**
  * A file based {@link org.apache.camel.spi.ReloadStrategy} which watches a file folder
  * for modified files and reload on file changes.
+ * <p/>
+ * This implementation uses the JDK {@link WatchService} to watch for when files are
+ * created or modified. Mac OS X users should be noted the osx JDK does not support
+ * native file system changes and therefore the watch service is much slower than on
+ * linux or windows systems.
  */
 public class FileWatcherReloadStrategy extends ReloadStrategySupport {
 
-    // TODO: support multiple folders
-
     private Path folder;
     private WatchService watcher;
     private ExecutorService executorService;
@@ -63,6 +66,11 @@ public class FileWatcherReloadStrategy extends ReloadStrategySupport {
 
     @Override
     protected void doStart() throws Exception {
+        if (folder == null) {
+            // no folder configured
+            return;
+        }
+
         log.info("Starting ReloadStrategy to watch directory: {}", folder);
         try {
             this.watcher = folder.getFileSystem().newWatchService();
@@ -79,7 +87,10 @@ public class FileWatcherReloadStrategy extends ReloadStrategySupport {
 
     @Override
     protected void doStop() throws Exception {
-        getCamelContext().getExecutorServiceManager().shutdownGraceful(executorService);
+        if (executorService != null) {
+            getCamelContext().getExecutorServiceManager().shutdownGraceful(executorService);
+            executorService = null;
+        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/camel/blob/4df16501/camel-core/src/main/java/org/apache/camel/main/MainSupport.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/main/MainSupport.java b/camel-core/src/main/java/org/apache/camel/main/MainSupport.java
index f84f52e..cb77814 100644
--- a/camel-core/src/main/java/org/apache/camel/main/MainSupport.java
+++ b/camel-core/src/main/java/org/apache/camel/main/MainSupport.java
@@ -490,7 +490,26 @@ public abstract class MainSupport extends ServiceSupport {
             camelContext.setReloadStrategy(reload);
             // ensure reload is added as service and started
             camelContext.addService(reload);
+            // and ensure its register in JMX (which requires manually to be added because CamelContext is already started)
+            Object managedObject = camelContext.getManagementStrategy().getManagementObjectStrategy().getManagedObjectForService(camelContext, reload);
+            if (managedObject == null) {
+                // service should not be managed
+                return;
+            }
+
+            // skip already managed services, for example if a route has been restarted
+            if (camelContext.getManagementStrategy().isManaged(managedObject, null)) {
+                LOG.trace("The service is already managed: {}", reload);
+                return;
+            }
+
+            try {
+                camelContext.getManagementStrategy().manageObject(managedObject);
+            } catch (Exception e) {
+                LOG.warn("Could not register service: " + reload + " as Service MBean.", e);
+            }
         }
+
         // try to load the route builders from the routeBuilderClasses
         loadRouteBuilders(camelContext);
         for (RouteBuilder routeBuilder : routeBuilders) {

http://git-wip-us.apache.org/repos/asf/camel/blob/4df16501/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedReloadStrategy.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedReloadStrategy.java b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedReloadStrategy.java
index 3635c7c..9660a30 100644
--- a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedReloadStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedReloadStrategy.java
@@ -34,6 +34,11 @@ public class ManagedReloadStrategy extends ManagedService implements ManagedRelo
     }
 
     @Override
+    public void forceReloadCamelContext() {
+        reloadStrategy.onReloadCamelContext(getContext());
+    }
+
+    @Override
     public String getStrategy() {
         return reloadStrategy.getClass().getSimpleName();
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/4df16501/camel-core/src/main/java/org/apache/camel/model/ModelHelper.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/model/ModelHelper.java b/camel-core/src/main/java/org/apache/camel/model/ModelHelper.java
index 871bdad..3a41d1a 100644
--- a/camel-core/src/main/java/org/apache/camel/model/ModelHelper.java
+++ b/camel-core/src/main/java/org/apache/camel/model/ModelHelper.java
@@ -30,6 +30,11 @@ import javax.xml.bind.Marshaller;
 import javax.xml.transform.OutputKeys;
 import javax.xml.transform.TransformerException;
 
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
 import org.apache.camel.CamelContext;
 import org.apache.camel.Expression;
 import org.apache.camel.NamedNode;
@@ -39,10 +44,6 @@ import org.apache.camel.model.language.ExpressionDefinition;
 import org.apache.camel.spi.NamespaceAware;
 import org.apache.camel.spi.TypeConverterRegistry;
 import org.apache.camel.util.ObjectHelper;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
 
 import static org.apache.camel.model.ProcessorDefinitionHelper.filterTypeInOutputs;
 

http://git-wip-us.apache.org/repos/asf/camel/blob/4df16501/camel-core/src/main/java/org/apache/camel/support/ReloadStrategySupport.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/support/ReloadStrategySupport.java b/camel-core/src/main/java/org/apache/camel/support/ReloadStrategySupport.java
index 7dbc14b..aa775f5 100644
--- a/camel-core/src/main/java/org/apache/camel/support/ReloadStrategySupport.java
+++ b/camel-core/src/main/java/org/apache/camel/support/ReloadStrategySupport.java
@@ -18,6 +18,10 @@ package org.apache.camel.support;
 
 import java.io.InputStream;
 
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
 import org.apache.camel.CamelContext;
 import org.apache.camel.model.ModelHelper;
 import org.apache.camel.model.RoutesDefinition;
@@ -26,9 +30,6 @@ import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.ServiceHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
 
 /**
  * Base class for implementing custom {@link ReloadStrategy} SPI plugins.