You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2017/08/08 11:30:44 UTC

[10/10] camel git commit: CAMEL-11580: Add JMX api RouteController and SupervisingRouteController

CAMEL-11580: Add JMX api RouteController and SupervisingRouteController


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

Branch: refs/heads/master
Commit: 43ca138867997d4997dadd30db080aef7bc9ef2d
Parents: 2b832e9
Author: lburgazzoli <lb...@gmail.com>
Authored: Mon Aug 7 17:08:44 2017 +0200
Committer: lburgazzoli <lb...@gmail.com>
Committed: Tue Aug 8 13:29:29 2017 +0200

----------------------------------------------------------------------
 .../mbean/ManagedRouteControllerMBean.java      | 27 +++++++
 .../DefaultManagementLifecycleStrategy.java     | 22 ++++++
 .../DefaultManagementNamingStrategy.java        | 18 +++++
 .../DefaultManagementObjectStrategy.java        |  7 ++
 .../management/ManagedManagementStrategy.java   |  4 +
 .../mbean/ManagedRouteController.java           | 57 ++++++++++++++
 .../camel/spi/ManagementNamingStrategy.java     |  2 +
 .../camel/spi/ManagementObjectStrategy.java     |  2 +
 .../endpoint/CamelRouteControllerEndpoint.java  | 60 +++++++++++++++
 ...outeControllerEndpointAutoConfiguration.java | 49 ++++++++++++
 .../CamelRouteControllerMvcEndpoint.java        | 79 ++++++++++++++++++++
 .../main/resources/META-INF/spring.factories    |  1 +
 12 files changed, 328 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/43ca1388/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedRouteControllerMBean.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedRouteControllerMBean.java b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedRouteControllerMBean.java
new file mode 100644
index 0000000..4422ed8
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedRouteControllerMBean.java
@@ -0,0 +1,27 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.api.management.mbean;
+
+import java.util.Collection;
+
+import org.apache.camel.api.management.ManagedAttribute;
+
+public interface ManagedRouteControllerMBean {
+
+    @ManagedAttribute(description = "Controlled Routes")
+    Collection<String> getControlledRoutes();
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/43ca1388/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java
index 9a70390..3cf6f09 100644
--- a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java
@@ -219,6 +219,17 @@ public class DefaultManagementLifecycleStrategy extends ServiceSupport implement
 
         // register any pre registered now that we are initialized
         enlistPreRegisteredServices();
+
+        try {
+            Object me = getManagementObjectStrategy().getManagedObjectForRouteController(camelContext);
+            if (me == null) {
+                // endpoint should not be managed
+                return;
+            }
+            manageObject(me);
+        } catch (Exception e) {
+            LOG.warn("Could not register RouteController MBean. This exception will be ignored.", e);
+        }
     }
 
     private String findFreeName(Object mc, ManagementNameStrategy strategy, String name) throws MalformedObjectNameException {
@@ -276,6 +287,17 @@ public class DefaultManagementLifecycleStrategy extends ServiceSupport implement
         if (!initialized) {
             return;
         }
+
+        try {
+            Object mc = getManagementObjectStrategy().getManagedObjectForRouteController(context);
+            // the context could have been removed already
+            if (getManagementStrategy().isManaged(mc, null)) {
+                unmanageObject(mc);
+            }
+        } catch (Exception e) {
+            LOG.warn("Could not unregister RouteController MBean", e);
+        }
+
         try {
             Object mc = getManagementObjectStrategy().getManagedObjectForCamelContext(context);
             // the context could have been removed already

http://git-wip-us.apache.org/repos/asf/camel/blob/43ca1388/camel-core/src/main/java/org/apache/camel/management/DefaultManagementNamingStrategy.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementNamingStrategy.java b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementNamingStrategy.java
index 56b85c8..341b9e9 100644
--- a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementNamingStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementNamingStrategy.java
@@ -52,6 +52,7 @@ public class DefaultManagementNamingStrategy implements ManagementNamingStrategy
     public static final String KEY_TYPE = "type";
     public static final String KEY_CONTEXT = "context";
     public static final String TYPE_CONTEXT = "context";
+    public static final String TYPE_ROUTE_CONTROLLER= "routecontroller";
     public static final String TYPE_ENDPOINT = "endpoints";
     public static final String TYPE_DATAFORMAT = "dataformats";
     public static final String TYPE_PROCESSOR = "processors";
@@ -112,6 +113,23 @@ public class DefaultManagementNamingStrategy implements ManagementNamingStrategy
         return getObjectNameForCamelContext(managementName, name);
     }
 
+    @Override
+    public ObjectName getObjectNameForRouteController(CamelContext context) throws MalformedObjectNameException {
+        // prefer to use the given management name if previously assigned
+        String managementName = context.getManagementName();
+        if (managementName == null) {
+            managementName = context.getManagementNameStrategy().getName();
+        }
+
+        StringBuilder buffer = new StringBuilder();
+        buffer.append(domainName).append(":");
+        buffer.append(KEY_CONTEXT + "=").append(getContextId(managementName)).append(",");
+        buffer.append(KEY_TYPE + "=" + TYPE_ROUTE_CONTROLLER + ",");
+        buffer.append(KEY_NAME + "=").append(ObjectName.quote(context.getName()));
+
+        return createObjectName(buffer);
+    }
+
     public ObjectName getObjectNameForEndpoint(Endpoint endpoint) throws MalformedObjectNameException {
         StringBuilder buffer = new StringBuilder();
         buffer.append(domainName).append(":");

http://git-wip-us.apache.org/repos/asf/camel/blob/43ca1388/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java
index c53cffb..8e785f2 100644
--- a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java
@@ -70,6 +70,7 @@ import org.apache.camel.management.mbean.ManagedResequencer;
 import org.apache.camel.management.mbean.ManagedRollback;
 import org.apache.camel.management.mbean.ManagedRoundRobinLoadBalancer;
 import org.apache.camel.management.mbean.ManagedRoute;
+import org.apache.camel.management.mbean.ManagedRouteController;
 import org.apache.camel.management.mbean.ManagedRoutingSlip;
 import org.apache.camel.management.mbean.ManagedSamplingThrottler;
 import org.apache.camel.management.mbean.ManagedScheduledPollConsumer;
@@ -220,6 +221,12 @@ public class DefaultManagementObjectStrategy implements ManagementObjectStrategy
         return me;
     }
 
+    public Object getManagedObjectForRouteController(CamelContext context) {
+        ManagedRouteController mrc = new ManagedRouteController((ModelCamelContext)context);
+        mrc.init(context.getManagementStrategy());
+        return mrc;
+    }
+
     public Object getManagedObjectForRoute(CamelContext context, Route route) {
         ManagedRoute mr;
         if (route.supportsSuspension()) {

http://git-wip-us.apache.org/repos/asf/camel/blob/43ca1388/camel-core/src/main/java/org/apache/camel/management/ManagedManagementStrategy.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/management/ManagedManagementStrategy.java b/camel-core/src/main/java/org/apache/camel/management/ManagedManagementStrategy.java
index 58a6982..5754a50 100644
--- a/camel-core/src/main/java/org/apache/camel/management/ManagedManagementStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/management/ManagedManagementStrategy.java
@@ -32,6 +32,7 @@ import org.apache.camel.management.mbean.ManagedEventNotifier;
 import org.apache.camel.management.mbean.ManagedProcessor;
 import org.apache.camel.management.mbean.ManagedProducer;
 import org.apache.camel.management.mbean.ManagedRoute;
+import org.apache.camel.management.mbean.ManagedRouteController;
 import org.apache.camel.management.mbean.ManagedService;
 import org.apache.camel.management.mbean.ManagedThreadPool;
 import org.apache.camel.management.mbean.ManagedTracer;
@@ -89,6 +90,9 @@ public class ManagedManagementStrategy extends DefaultManagementStrategy {
         if (managedObject instanceof ManagedCamelContext) {
             ManagedCamelContext mcc = (ManagedCamelContext) managedObject;
             objectName = getManagementNamingStrategy().getObjectNameForCamelContext(mcc.getContext());
+        } else if (managedObject instanceof ManagedRouteController) {
+            ManagedRouteController mrc = (ManagedRouteController) managedObject;
+            objectName = getManagementNamingStrategy().getObjectNameForRouteController(mrc.getContext());
         } else if (managedObject instanceof ManagedComponent) {
             ManagedComponent mc = (ManagedComponent) managedObject;
             objectName = getManagementNamingStrategy().getObjectNameForComponent(mc.getComponent(), mc.getComponentName());

http://git-wip-us.apache.org/repos/asf/camel/blob/43ca1388/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRouteController.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRouteController.java b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRouteController.java
new file mode 100644
index 0000000..936f54c
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRouteController.java
@@ -0,0 +1,57 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.management.mbean;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.stream.Collectors;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Route;
+import org.apache.camel.api.management.mbean.ManagedRouteControllerMBean;
+import org.apache.camel.model.ModelCamelContext;
+import org.apache.camel.spi.ManagementStrategy;
+import org.apache.camel.spi.RouteController;
+
+public class ManagedRouteController implements ManagedRouteControllerMBean {
+    private final ModelCamelContext context;
+
+    public ManagedRouteController(ModelCamelContext context) {
+        this.context = context;
+    }
+
+    public void init(ManagementStrategy strategy) {
+        // do nothing
+    }
+
+    public CamelContext getContext() {
+        return context;
+    }
+
+    @Override
+    public Collection<String> getControlledRoutes() {
+        RouteController controller = context.getRouteController();
+
+        if (controller != null) {
+            return controller.getControlledRoutes().stream()
+                .map(Route::getId)
+                .collect(Collectors.toList());
+        }
+
+        return Collections.emptyList();
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/43ca1388/camel-core/src/main/java/org/apache/camel/spi/ManagementNamingStrategy.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/spi/ManagementNamingStrategy.java b/camel-core/src/main/java/org/apache/camel/spi/ManagementNamingStrategy.java
index f363567..72bb00a 100644
--- a/camel-core/src/main/java/org/apache/camel/spi/ManagementNamingStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/spi/ManagementNamingStrategy.java
@@ -44,6 +44,8 @@ public interface ManagementNamingStrategy {
 
     ObjectName getObjectNameForCamelContext(CamelContext context) throws MalformedObjectNameException;
 
+    ObjectName getObjectNameForRouteController(CamelContext context) throws MalformedObjectNameException;
+
     ObjectName getObjectNameForComponent(Component component, String name) throws MalformedObjectNameException;
 
     ObjectName getObjectNameForEndpoint(Endpoint endpoint) throws MalformedObjectNameException;

http://git-wip-us.apache.org/repos/asf/camel/blob/43ca1388/camel-core/src/main/java/org/apache/camel/spi/ManagementObjectStrategy.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/spi/ManagementObjectStrategy.java b/camel-core/src/main/java/org/apache/camel/spi/ManagementObjectStrategy.java
index b6acc7f..a11b2b1 100644
--- a/camel-core/src/main/java/org/apache/camel/spi/ManagementObjectStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/spi/ManagementObjectStrategy.java
@@ -45,6 +45,8 @@ public interface ManagementObjectStrategy {
     Object getManagedObjectForErrorHandler(CamelContext context, RouteContext routeContext,
                                            Processor errorHandler, ErrorHandlerFactory errorHandlerBuilder);
 
+    Object getManagedObjectForRouteController(CamelContext context);
+
     Object getManagedObjectForRoute(CamelContext context, Route route);
 
     Object getManagedObjectForConsumer(CamelContext context, Consumer consumer);

http://git-wip-us.apache.org/repos/asf/camel/blob/43ca1388/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRouteControllerEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRouteControllerEndpoint.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRouteControllerEndpoint.java
new file mode 100644
index 0000000..357a8d0
--- /dev/null
+++ b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRouteControllerEndpoint.java
@@ -0,0 +1,60 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.spring.boot.actuate.endpoint;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Route;
+import org.apache.camel.spi.RouteController;
+import org.springframework.boot.actuate.endpoint.AbstractEndpoint;
+import org.springframework.boot.actuate.endpoint.Endpoint;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * {@link Endpoint} to expose {@link RouteController} information.
+ */
+@ConfigurationProperties(prefix = "endpoints." + CamelRouteControllerEndpoint.ENDPOINT_ID)
+public class CamelRouteControllerEndpoint extends AbstractEndpoint<List<String>> {
+
+    public static final String ENDPOINT_ID = "camelroutecontroller";
+
+    private CamelContext camelContext;
+
+    public CamelRouteControllerEndpoint(CamelContext camelContext) {
+        super(ENDPOINT_ID);
+        this.camelContext = camelContext;
+        // is enabled by default
+        this.setEnabled(true);
+    }
+
+    @Override
+    public List<String> invoke() {
+        RouteController controller = camelContext.getRouteController();
+
+        if (controller != null) {
+            return controller.getControlledRoutes().stream()
+                .map(Route::getId)
+                .collect(Collectors.toList());
+        }
+
+        return Collections.emptyList();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/43ca1388/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRouteControllerEndpointAutoConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRouteControllerEndpointAutoConfiguration.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRouteControllerEndpointAutoConfiguration.java
new file mode 100644
index 0000000..2c09427
--- /dev/null
+++ b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRouteControllerEndpointAutoConfiguration.java
@@ -0,0 +1,49 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.spring.boot.actuate.endpoint;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * Auto configuration for the {@link CamelRouteControllerEndpoint}.
+ */
+@Configuration
+@ConditionalOnClass({CamelRouteControllerEndpoint.class})
+@ConditionalOnBean(CamelAutoConfiguration.class)
+@AutoConfigureAfter(CamelAutoConfiguration.class)
+public class CamelRouteControllerEndpointAutoConfiguration {
+    @Bean
+    @ConditionalOnClass(CamelContext.class)
+    @ConditionalOnMissingBean
+    public CamelRouteControllerEndpoint routeControllerEndpoint(CamelContext camelContext) {
+        return new CamelRouteControllerEndpoint(camelContext);
+    }
+
+    @Bean
+    @ConditionalOnClass(CamelContext.class)
+    @ConditionalOnMissingBean
+    public CamelRouteControllerMvcEndpoint routeControllerMvcEndpoint(CamelRouteControllerEndpoint delegate) {
+        return new CamelRouteControllerMvcEndpoint(delegate);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/43ca1388/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRouteControllerMvcEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRouteControllerMvcEndpoint.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRouteControllerMvcEndpoint.java
new file mode 100644
index 0000000..cbde49e
--- /dev/null
+++ b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRouteControllerMvcEndpoint.java
@@ -0,0 +1,79 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.spring.boot.actuate.endpoint;
+
+import java.util.function.Supplier;
+
+import org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter;
+import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+/**
+ * Adapter to expose {@link CamelRouteControllerEndpoint} as an {@link MvcEndpoint}.
+ */
+@ConfigurationProperties(prefix = "endpoints." + CamelRouteControllerEndpoint.ENDPOINT_ID)
+public class CamelRouteControllerMvcEndpoint extends EndpointMvcAdapter {
+
+    /**
+     * Default path
+     */
+    public static final String PATH = "/camel/route-controller";
+
+    private final CamelRouteControllerEndpoint delegate;
+
+    public CamelRouteControllerMvcEndpoint(CamelRouteControllerEndpoint delegate) {
+        super(delegate);
+
+        this.setPath(PATH);
+        this.delegate = delegate;
+    }
+
+    // ********************************************
+    // Endpoints
+    // ********************************************
+
+    // ********************************************
+    // Helpers
+    // ********************************************
+
+    private Object doIfEnabled(Supplier<Object> supplier) {
+        if (!delegate.isEnabled()) {
+            return getDisabledResponse();
+        }
+
+        return supplier.get();
+    }
+
+    @SuppressWarnings("serial")
+    @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
+    public static class GenericException extends RuntimeException {
+        public GenericException(String message, Throwable cause) {
+            super(message, cause);
+
+        }
+    }
+
+    @SuppressWarnings("serial")
+    @ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "No such route")
+    public static class NoSuchRouteException extends RuntimeException {
+        public NoSuchRouteException(String message) {
+            super(message);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/43ca1388/components/camel-spring-boot/src/main/resources/META-INF/spring.factories
----------------------------------------------------------------------
diff --git a/components/camel-spring-boot/src/main/resources/META-INF/spring.factories b/components/camel-spring-boot/src/main/resources/META-INF/spring.factories
index 8550060..ac8c58e 100644
--- a/components/camel-spring-boot/src/main/resources/META-INF/spring.factories
+++ b/components/camel-spring-boot/src/main/resources/META-INF/spring.factories
@@ -19,6 +19,7 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
 org.apache.camel.spring.boot.CamelAutoConfiguration,\
 org.apache.camel.spring.boot.SupervisingRouteControllerAutoConfiguration,\
 org.apache.camel.spring.boot.actuate.endpoint.CamelRoutesEndpointAutoConfiguration,\
+org.apache.camel.spring.boot.actuate.endpoint.CamelRouteControllerEndpointAutoConfiguration,\
 org.apache.camel.spring.boot.actuate.health.CamelHealthAutoConfiguration,\
 org.apache.camel.spring.boot.cloud.CamelCloudAutoConfiguration,\
 org.apache.camel.spring.boot.cloud.CamelCloudServiceCallConfigurationAutoConfiguration,\