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 2018/02/10 09:18:25 UTC

[camel] branch master updated: CAMEL-12253: Add restart action to controlbus

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 54156c9  CAMEL-12253: Add restart action to controlbus
54156c9 is described below

commit 54156c914adcd564555669096dbfce7ab6103ea1
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Feb 10 10:17:33 2018 +0100

    CAMEL-12253: Add restart action to controlbus
---
 camel-core/src/main/docs/controlbus-component.adoc |  7 +-
 .../component/controlbus/ControlBusEndpoint.java   | 17 ++++-
 .../component/controlbus/ControlBusProducer.java   | 10 +++
 .../controlbus/ControlBusRestartRouteTest.java     | 76 ++++++++++++++++++++++
 4 files changed, 105 insertions(+), 5 deletions(-)

diff --git a/camel-core/src/main/docs/controlbus-component.adoc b/camel-core/src/main/docs/controlbus-component.adoc
index 221aab4..a7ebf97 100644
--- a/camel-core/src/main/docs/controlbus-component.adoc
+++ b/camel-core/src/main/docs/controlbus-component.adoc
@@ -85,14 +85,15 @@ with the following path and query parameters:
 | *language* | Allows you to specify the name of a Language to use for evaluating the message body. If there is any result from the evaluation then the result is put in the message body. |  | Language
 |===
 
-==== Query Parameters (5 parameters):
+==== Query Parameters (6 parameters):
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *action* (producer) | To denote an action that can be either: start stop or status. To either start or stop a route or to get the status of the route as output in the message body. You can use suspend and resume from Camel 2.11.1 onwards to either suspend or resume a route. And from Camel 2.11.1 onwards you can use stats to get performance statics returned in XML format; the routeId option can be used to define which route to get the performance stats for if routeId is not defined then [...]
+| *action* (producer) | To denote an action that can be either: start stop or status. To either start or stop a route or to get the status of the route as output in the message body. You can use suspend and resume from Camel 2.11.1 onwards to either suspend or resume a route. And from Camel 2.11.1 onwards you can use stats to get performance statics returned in XML format; the routeId option can be used to define which route to get the performance stats for if routeId is not defined then [...]
 | *async* (producer) | Whether to execute the control bus task asynchronously. Important: If this option is enabled then any result from the task is not set on the Exchange. This is only possible if executing tasks synchronously. | false | boolean
 | *loggingLevel* (producer) | Logging level used for logging when task is done or if any exceptions occurred during processing the task. | INFO | LoggingLevel
+| *restartDelay* (producer) | The delay in millis to use when restarting a route. | 1000 | int
 | *routeId* (producer) | To specify a route by its id. The special keyword current indicates the current route. |  | String
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used or Camel is allowed to use asynchronous processing (if supported). | false | boolean
 |===
@@ -185,4 +186,4 @@ We use `async=true` to stop Camel asynchronously as otherwise we
 would be trying to stop Camel while it was in-flight processing the
 message we sent to the control bus component.
 
-TIP: You can also use other languages such as <<groovy-language,Groovy>>, etc.
\ No newline at end of file
+TIP: You can also use other languages such as <<groovy-language,Groovy>>, etc.
diff --git a/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusEndpoint.java b/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusEndpoint.java
index bedc299..20eb4a2 100644
--- a/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusEndpoint.java
+++ b/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusEndpoint.java
@@ -44,8 +44,10 @@ public class ControlBusEndpoint extends DefaultEndpoint {
     private Language language;
     @UriParam
     private String routeId;
-    @UriParam(enums = "start,stop,suspend,resume,status")
+    @UriParam(enums = "start,stop,suspend,resume,restart,status,stats")
     private String action;
+    @UriParam(defaultValue = "1000")
+    private int restartDelay = 1000;
     @UriParam
     private boolean async;
     @UriParam(defaultValue = "INFO")
@@ -112,12 +114,23 @@ public class ControlBusEndpoint extends DefaultEndpoint {
      * You can use suspend and resume from Camel 2.11.1 onwards to either suspend or resume a route.
      * And from Camel 2.11.1 onwards you can use stats to get performance statics returned in XML format;
      * the routeId option can be used to define which route to get the performance stats for, if routeId is not defined,
-     * then you get statistics for the entire CamelContext.
+     * then you get statistics for the entire CamelContext. The restart action will restart the route.
      */
     public void setAction(String action) {
         this.action = action;
     }
 
+    public int getRestartDelay() {
+        return restartDelay;
+    }
+
+    /**
+     * The delay in millis to use when restarting a route.
+     */
+    public void setRestartDelay(int restartDelay) {
+        this.restartDelay = restartDelay;
+    }
+
     public boolean isAsync() {
         return async;
     }
diff --git a/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusProducer.java b/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusProducer.java
index f2d1574..c3d5bf5 100644
--- a/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusProducer.java
+++ b/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusProducer.java
@@ -163,6 +163,16 @@ public class ControlBusProducer extends DefaultAsyncProducer {
                     getEndpoint().getCamelContext().suspendRoute(id);
                 } else if ("resume".equals(action)) {
                     getEndpoint().getCamelContext().resumeRoute(id);
+                } else if ("restart".equals(action)) {
+                    getEndpoint().getCamelContext().stopRoute(id);
+                    int delay = getEndpoint().getRestartDelay();
+                    try {
+                        log.debug("Sleeping {} ms before starting route");
+                        Thread.sleep(delay);
+                    } catch (InterruptedException e) {
+                        // ignore
+                    }
+                    getEndpoint().getCamelContext().startRoute(id);
                 } else if ("status".equals(action)) {
                     ServiceStatus status = getEndpoint().getCamelContext().getRouteStatus(id);
                     if (status != null) {
diff --git a/camel-core/src/test/java/org/apache/camel/component/controlbus/ControlBusRestartRouteTest.java b/camel-core/src/test/java/org/apache/camel/component/controlbus/ControlBusRestartRouteTest.java
new file mode 100644
index 0000000..20c29a3
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/component/controlbus/ControlBusRestartRouteTest.java
@@ -0,0 +1,76 @@
+/**
+ * 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.component.controlbus;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Route;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.support.RoutePolicySupport;
+
+public class ControlBusRestartRouteTest extends ContextTestSupport {
+
+    private MyRoutePolicy myRoutePolicy = new MyRoutePolicy();
+
+    public void testControlBusRestart() throws Exception {
+        assertEquals(1, myRoutePolicy.getStart());
+        assertEquals(0, myRoutePolicy.getStop());
+
+        assertEquals("Started", context.getRouteStatus("foo").name());
+
+        template.sendBody("controlbus:route?routeId=foo&action=restart", null);
+
+        assertEquals("Started", context.getRouteStatus("foo").name());
+
+        assertEquals(2, myRoutePolicy.getStart());
+        assertEquals(1, myRoutePolicy.getStop());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("seda:foo").routeId("foo").routePolicy(myRoutePolicy)
+                    .to("mock:foo");
+            }
+        };
+    }
+
+    private final class MyRoutePolicy extends RoutePolicySupport {
+
+        private int start;
+        private int stop;
+
+        @Override
+        public void onStart(Route route) {
+            start++;
+        }
+
+        @Override
+        public void onStop(Route route) {
+            stop++;
+        }
+
+        public int getStart() {
+            return start;
+        }
+
+        public int getStop() {
+            return stop;
+        }
+    }
+}

-- 
To stop receiving notification emails like this one, please contact
davsclaus@apache.org.