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 2021/12/30 12:04:31 UTC

[camel] 15/30: CAMEL-17384: Developer Console SPI

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

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

commit 2b61f07477e3a06901757b25ec097df8b623e4ac
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Dec 28 16:12:27 2021 +0100

    CAMEL-17384: Developer Console SPI
---
 .../impl/event/CamelContextResumeFailureEvent.java |  2 +-
 .../event/CamelContextStartupFailureEvent.java     |  2 +-
 .../impl/event/CamelContextStopFailureEvent.java   |  2 +-
 .../camel/impl/event/ExchangeCompletedEvent.java   |  2 +-
 .../camel/impl/event/ExchangeCreatedEvent.java     |  2 +-
 .../camel/impl/event/ExchangeFailedEvent.java      |  4 +-
 .../impl/event/ExchangeFailureHandledEvent.java    | 14 ++--
 .../impl/event/ExchangeFailureHandlingEvent.java   |  6 +-
 .../camel/impl/event/ExchangeRedeliveryEvent.java  |  5 +-
 .../camel/impl/event/ExchangeSendingEvent.java     |  2 +-
 .../apache/camel/impl/event/ExchangeSentEvent.java |  5 +-
 .../apache/camel/impl/event/RouteAddedEvent.java   |  2 +-
 .../camel/impl/event/RouteReloadedEvent.java       |  2 +-
 .../apache/camel/impl/event/RouteRemovedEvent.java |  2 +-
 .../apache/camel/impl/event/RouteStartedEvent.java |  2 +-
 .../camel/impl/event/RouteStartingEvent.java       |  2 +-
 .../apache/camel/impl/event/RouteStoppedEvent.java |  2 +-
 .../camel/impl/event/RouteStoppingEvent.java       |  2 +-
 .../impl/event/ServiceStartupFailureEvent.java     |  2 +-
 .../camel/impl/event/ServiceStopFailureEvent.java  |  2 +-
 .../camel/impl/event/StepCompletedEvent.java       |  2 +-
 .../apache/camel/impl/event/StepFailedEvent.java   |  2 +-
 .../apache/camel/impl/event/StepStartedEvent.java  |  2 +-
 .../services/org/apache/camel/dev-console/event    |  2 +
 .../camel/impl/console/AbstractDevConsole.java     |  3 +-
 .../impl/console/DefaultDevConsoleRegistry.java    | 18 ++++-
 .../apache/camel/impl/console/EventConsole.java    | 93 ++++++++++++++++++++++
 .../java/org/apache/camel/support/EventHelper.java |  2 +-
 28 files changed, 149 insertions(+), 39 deletions(-)

diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextResumeFailureEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextResumeFailureEvent.java
index 5adac86..90e27dc 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextResumeFailureEvent.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextResumeFailureEvent.java
@@ -36,6 +36,6 @@ public class CamelContextResumeFailureEvent extends AbstractContextEvent impleme
 
     @Override
     public String toString() {
-        return "Failed to resume Camel: " + getContext().getName() + " due to " + cause.getMessage();
+        return "Failed to resume CamelContext: " + getContext().getName() + " due to " + cause.getMessage();
     }
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextStartupFailureEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextStartupFailureEvent.java
index c13ca37..3de5066 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextStartupFailureEvent.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextStartupFailureEvent.java
@@ -37,6 +37,6 @@ public class CamelContextStartupFailureEvent extends AbstractContextEvent
 
     @Override
     public String toString() {
-        return "Failed to start Camel: " + getContext().getName() + " due to " + cause.getMessage();
+        return "CamelContext startup failure: " + getContext().getName() + " due to " + cause.getMessage();
     }
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextStopFailureEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextStopFailureEvent.java
index 0e1db96..190982c 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextStopFailureEvent.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextStopFailureEvent.java
@@ -36,6 +36,6 @@ public class CamelContextStopFailureEvent extends AbstractContextEvent implement
 
     @Override
     public String toString() {
-        return "Failed to stop Camel: " + getContext().getName() + " due to " + cause.getMessage();
+        return "Failed to stop CamelContext: " + getContext().getName() + " due to " + cause.getMessage();
     }
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeCompletedEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeCompletedEvent.java
index eb34246..68d12ff 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeCompletedEvent.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeCompletedEvent.java
@@ -28,6 +28,6 @@ public class ExchangeCompletedEvent extends AbstractExchangeEvent implements Cam
 
     @Override
     public String toString() {
-        return getExchange().getExchangeId() + " exchange completed: " + getExchange();
+        return getExchange().getExchangeId() + ": Completed exchange";
     }
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeCreatedEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeCreatedEvent.java
index 625b4e5..a946d11 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeCreatedEvent.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeCreatedEvent.java
@@ -34,6 +34,6 @@ public class ExchangeCreatedEvent extends AbstractExchangeEvent implements Camel
 
     @Override
     public String toString() {
-        return getExchange().getExchangeId() + " exchange created: " + getExchange();
+        return getExchange().getExchangeId() + ": Created exchange";
     }
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeFailedEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeFailedEvent.java
index 8c74a21..d6dd010 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeFailedEvent.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeFailedEvent.java
@@ -35,9 +35,9 @@ public class ExchangeFailedEvent extends AbstractExchangeEvent implements CamelE
     public String toString() {
         Exception cause = getExchange().getException();
         if (cause != null) {
-            return getExchange().getExchangeId() + " exchange failure: " + getExchange() + " cause " + cause;
+            return getExchange().getExchangeId() + ": Failed exchange due to " + cause.getMessage();
         } else {
-            return getExchange().getExchangeId() + " exchange failure: " + getExchange();
+            return getExchange().getExchangeId() + ": Failed exchange";
         }
     }
 
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeFailureHandledEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeFailureHandledEvent.java
index 9bd4bb8..ae70056 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeFailureHandledEvent.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeFailureHandledEvent.java
@@ -65,13 +65,15 @@ public class ExchangeFailureHandledEvent extends AbstractExchangeEvent implement
 
     @Override
     public String toString() {
-        if (isDeadLetterChannel()) {
-            String uri = URISupport.sanitizeUri(deadLetterUri);
-            return getExchange().getExchangeId() + " exchange failed: " + getExchange()
-                   + " but was handled by dead letter channel: " + uri;
+        if (isHandled()) {
+            if (isDeadLetterChannel()) {
+                String uri = URISupport.sanitizeUri(deadLetterUri);
+                return getExchange().getExchangeId() + ": Failed and handled by dead letter channel: " + uri;
+            } else {
+                return getExchange().getExchangeId() + ": Failed and handled by error handler";
+            }
         } else {
-            return getExchange().getExchangeId() + " exchange failed: " + getExchange()
-                   + " but was processed by failure processor: " + failureHandler;
+            return getExchange().getExchangeId() + ": Continued and continued";
         }
     }
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeFailureHandlingEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeFailureHandlingEvent.java
index 39ee3b6..4666fa2 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeFailureHandlingEvent.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeFailureHandlingEvent.java
@@ -55,11 +55,9 @@ public class ExchangeFailureHandlingEvent extends AbstractExchangeEvent implemen
     public String toString() {
         if (isDeadLetterChannel()) {
             String uri = URISupport.sanitizeUri(deadLetterUri);
-            return getExchange().getExchangeId() + " exchange failed: " + getExchange()
-                   + " but is being handled by dead letter channel: " + uri;
+            return getExchange().getExchangeId() + ": Failed and will be handled by dead letter channel: " + uri;
         } else {
-            return getExchange().getExchangeId() + " exchange failed: " + getExchange()
-                   + " but is being processed by failure processor: " + failureHandler;
+            return getExchange().getExchangeId() + ": Failed and will be handled by error handler";
         }
     }
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeRedeliveryEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeRedeliveryEvent.java
index deb8b02..2ea34d3 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeRedeliveryEvent.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeRedeliveryEvent.java
@@ -38,10 +38,9 @@ public class ExchangeRedeliveryEvent extends AbstractExchangeEvent implements Ca
     public String toString() {
         Exception cause = getExchange().getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class);
         if (cause != null) {
-            return getExchange().getExchangeId() + " exchange redelivery: " + getExchange() + " attempt " + attempt + " cause "
-                   + cause;
+            return getExchange().getExchangeId() + ": Redelivery attempt: " + attempt + " caused by: " + cause.getMessage();
         } else {
-            return getExchange().getExchangeId() + " exchange redelivery: " + getExchange() + " attempt " + attempt;
+            return getExchange().getExchangeId() + ": Redelivery attempt: " + attempt;
         }
     }
 
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeSendingEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeSendingEvent.java
index 41b225e..5937de3 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeSendingEvent.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeSendingEvent.java
@@ -52,7 +52,7 @@ public class ExchangeSendingEvent extends AbstractExchangeEvent implements Camel
 
     @Override
     public String toString() {
-        return getExchange().getExchangeId() + " exchange " + getExchange() + " sending to: " + endpoint;
+        return getExchange().getExchangeId() + ": Sending to: " + endpoint;
     }
 
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeSentEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeSentEvent.java
index b68ece1..eb82d15 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeSentEvent.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/ExchangeSentEvent.java
@@ -19,6 +19,7 @@ package org.apache.camel.impl.event;
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
 import org.apache.camel.spi.CamelEvent;
+import org.apache.camel.util.TimeUtils;
 
 /**
  * Event for <b>after</b> an {@link Exchange} has been sent to an {@link Endpoint}. The {@link ExchangeSentEvent} is an
@@ -54,8 +55,8 @@ public class ExchangeSentEvent extends AbstractExchangeEvent implements CamelEve
 
     @Override
     public String toString() {
-        return getExchange().getExchangeId() + " exchange " + getExchange() + " sent to: " + endpoint + " took: " + timeTaken
-               + " ms.";
+        String took = TimeUtils.printDuration(timeTaken);
+        return getExchange().getExchangeId() + ": Sent to: " + endpoint + " (took: " + took + ")";
     }
 
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteAddedEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteAddedEvent.java
index 8f39424..004cfda 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteAddedEvent.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteAddedEvent.java
@@ -29,6 +29,6 @@ public class RouteAddedEvent extends AbstractRouteEvent implements CamelEvent.Ro
 
     @Override
     public String toString() {
-        return "Added route: " + getRoute().getId();
+        return "Route added: " + getRoute().getId();
     }
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteReloadedEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteReloadedEvent.java
index de2ea8c..eeb5a30 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteReloadedEvent.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteReloadedEvent.java
@@ -44,6 +44,6 @@ public class RouteReloadedEvent extends AbstractRouteEvent implements CamelEvent
 
     @Override
     public String toString() {
-        return "Reloaded route: " + getRoute().getId();
+        return "Route reloaded: " + getRoute().getId();
     }
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteRemovedEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteRemovedEvent.java
index 0cceaac..9f50e16 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteRemovedEvent.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteRemovedEvent.java
@@ -29,6 +29,6 @@ public class RouteRemovedEvent extends AbstractRouteEvent implements CamelEvent.
 
     @Override
     public String toString() {
-        return "Removed route: " + getRoute().getId();
+        return "Route removed: " + getRoute().getId();
     }
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteStartedEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteStartedEvent.java
index 2a2ad1e..6206f44 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteStartedEvent.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteStartedEvent.java
@@ -28,6 +28,6 @@ public class RouteStartedEvent extends AbstractRouteEvent implements CamelEvent.
 
     @Override
     public String toString() {
-        return "Started route: " + getRoute().getId();
+        return "Route started: " + getRoute().getId();
     }
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteStartingEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteStartingEvent.java
index 73c5a8d..19c696c 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteStartingEvent.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteStartingEvent.java
@@ -28,6 +28,6 @@ public class RouteStartingEvent extends AbstractRouteEvent implements CamelEvent
 
     @Override
     public String toString() {
-        return "Starting route: " + getRoute().getId();
+        return "Route starting: " + getRoute().getId();
     }
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteStoppedEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteStoppedEvent.java
index 4dc0008..45e837d 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteStoppedEvent.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteStoppedEvent.java
@@ -28,6 +28,6 @@ public class RouteStoppedEvent extends AbstractRouteEvent implements CamelEvent.
 
     @Override
     public String toString() {
-        return "Stopped route: " + getRoute().getId();
+        return "Route stopped: " + getRoute().getId();
     }
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteStoppingEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteStoppingEvent.java
index 23e626e..24e6771 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteStoppingEvent.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/RouteStoppingEvent.java
@@ -28,6 +28,6 @@ public class RouteStoppingEvent extends AbstractRouteEvent implements CamelEvent
 
     @Override
     public String toString() {
-        return "Stopping route: " + getRoute().getId();
+        return "Route stopping: " + getRoute().getId();
     }
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/ServiceStartupFailureEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/ServiceStartupFailureEvent.java
index 515b878..3095ccf 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/event/ServiceStartupFailureEvent.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/ServiceStartupFailureEvent.java
@@ -51,6 +51,6 @@ public class ServiceStartupFailureEvent extends EventObject implements CamelEven
 
     @Override
     public String toString() {
-        return "Failure to start service: " + service + " due to " + cause.getMessage();
+        return "Service startup failure: " + service + " due to " + cause.getMessage();
     }
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/ServiceStopFailureEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/ServiceStopFailureEvent.java
index f512d26..f904b99 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/event/ServiceStopFailureEvent.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/ServiceStopFailureEvent.java
@@ -51,6 +51,6 @@ public class ServiceStopFailureEvent extends EventObject implements CamelEvent.S
 
     @Override
     public String toString() {
-        return "Failure to stop service: " + service + " due to " + cause.getMessage();
+        return "Service stop failure: " + service + " due to " + cause.getMessage();
     }
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/StepCompletedEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/StepCompletedEvent.java
index d90b195..5020c57 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/event/StepCompletedEvent.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/StepCompletedEvent.java
@@ -30,6 +30,6 @@ public class StepCompletedEvent extends AbstractStepEvent implements CamelEvent.
 
     @Override
     public String toString() {
-        return "Step[" + getStepId() + "] completed";
+        return "Step completed: " + getStepId();
     }
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/StepFailedEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/StepFailedEvent.java
index 89f1df0..17275f1 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/event/StepFailedEvent.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/StepFailedEvent.java
@@ -35,6 +35,6 @@ public class StepFailedEvent extends AbstractStepEvent implements CamelEvent.Ste
 
     @Override
     public String toString() {
-        return "Step[" + getStepId() + "] failed";
+        return "Step failure: " + getStepId() + " due to " + getCause().getMessage();
     }
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/StepStartedEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/StepStartedEvent.java
index 8c3c645..4c5890b 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/event/StepStartedEvent.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/StepStartedEvent.java
@@ -30,6 +30,6 @@ public class StepStartedEvent extends AbstractStepEvent implements CamelEvent.St
 
     @Override
     public String toString() {
-        return "Step[" + getStepId() + "] started";
+        return "Step started: " + getStepId();
     }
 }
diff --git a/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/dev-console/event b/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/dev-console/event
new file mode 100644
index 0000000..fbb283c
--- /dev/null
+++ b/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/dev-console/event
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.impl.console.EventConsole
diff --git a/core/camel-console/src/main/java/org/apache/camel/impl/console/AbstractDevConsole.java b/core/camel-console/src/main/java/org/apache/camel/impl/console/AbstractDevConsole.java
index cba5830..c1d5c06 100644
--- a/core/camel-console/src/main/java/org/apache/camel/impl/console/AbstractDevConsole.java
+++ b/core/camel-console/src/main/java/org/apache/camel/impl/console/AbstractDevConsole.java
@@ -21,11 +21,12 @@ import java.util.Map;
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.console.DevConsole;
+import org.apache.camel.support.service.ServiceSupport;
 
 /**
  * Base implementation for {@link DevConsole}.
  */
-public abstract class AbstractDevConsole implements DevConsole, CamelContextAware {
+public abstract class AbstractDevConsole extends ServiceSupport implements DevConsole, CamelContextAware {
 
     private CamelContext camelContext;
     private final Object lock;
diff --git a/core/camel-console/src/main/java/org/apache/camel/impl/console/DefaultDevConsoleRegistry.java b/core/camel-console/src/main/java/org/apache/camel/impl/console/DefaultDevConsoleRegistry.java
index 14eb111..2fd5c91 100644
--- a/core/camel-console/src/main/java/org/apache/camel/impl/console/DefaultDevConsoleRegistry.java
+++ b/core/camel-console/src/main/java/org/apache/camel/impl/console/DefaultDevConsoleRegistry.java
@@ -28,6 +28,7 @@ import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.console.DevConsole;
 import org.apache.camel.console.DevConsoleRegistry;
 import org.apache.camel.console.DevConsoleResolver;
+import org.apache.camel.support.service.ServiceHelper;
 import org.apache.camel.support.service.ServiceSupport;
 import org.apache.camel.util.StopWatch;
 import org.apache.camel.util.TimeUtils;
@@ -90,10 +91,23 @@ public class DefaultDevConsoleRegistry extends ServiceSupport implements DevCons
 
     @Override
     protected void doInit() throws Exception {
-        super.doInit();
-
         for (DevConsole console : consoles) {
             CamelContextAware.trySetCamelContext(console, camelContext);
+            ServiceHelper.initService(console);
+        }
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        for (DevConsole console : consoles) {
+            ServiceHelper.startService(console);
+        }
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        for (DevConsole console : consoles) {
+            ServiceHelper.stopService(console);
         }
     }
 
diff --git a/core/camel-console/src/main/java/org/apache/camel/impl/console/EventConsole.java b/core/camel-console/src/main/java/org/apache/camel/impl/console/EventConsole.java
new file mode 100644
index 0000000..bbd2393
--- /dev/null
+++ b/core/camel-console/src/main/java/org/apache/camel/impl/console/EventConsole.java
@@ -0,0 +1,93 @@
+/*
+ * 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.impl.console;
+
+import java.util.ArrayDeque;
+import java.util.Map;
+import java.util.Queue;
+
+import org.apache.camel.spi.CamelEvent;
+import org.apache.camel.spi.annotations.DevConsole;
+import org.apache.camel.support.EventNotifierSupport;
+
+@DevConsole("event")
+public class EventConsole extends AbstractDevConsole {
+
+    private int capacity = 25;
+
+    private final Queue<CamelEvent> events = new ArrayDeque<>(capacity);
+    private final Queue<CamelEvent.ExchangeEvent> exchangeEvents = new ArrayDeque<>(capacity);
+    private final ConsoleEventNotifier listener = new ConsoleEventNotifier();
+
+    public EventConsole() {
+        super("camel", "event");
+    }
+
+    @Override
+    protected void doInit() throws Exception {
+        getCamelContext().getManagementStrategy().addEventNotifier(listener);
+    }
+
+    @Override
+    protected void doShutdown() throws Exception {
+        getCamelContext().getManagementStrategy().removeEventNotifier(listener);
+        events.clear();
+    }
+
+    @Override
+    protected Object doCall(MediaType mediaType, Map<String, Object> options) {
+        // only text is supported
+        StringBuilder sb = new StringBuilder();
+
+        if (!events.isEmpty()) {
+            sb.append(String.format("Last %s Camel Events:", events.size()));
+            for (CamelEvent event : events) {
+                sb.append(String.format("\n    %s", event));
+            }
+            sb.append("\n");
+        }
+        if (!exchangeEvents.isEmpty()) {
+            sb.append("\n");
+            sb.append(String.format("Last %s Exchange Events:", exchangeEvents.size()));
+            for (CamelEvent.ExchangeEvent event : exchangeEvents) {
+                sb.append(String.format("\n    %s", event));
+            }
+            sb.append("\n");
+        }
+
+        return sb.toString();
+    }
+
+    private class ConsoleEventNotifier extends EventNotifierSupport {
+
+        @Override
+        public void notify(CamelEvent event) throws Exception {
+            if (event instanceof CamelEvent.ExchangeEvent) {
+                if (exchangeEvents.size() >= capacity) {
+                    exchangeEvents.poll();
+                }
+                exchangeEvents.add((CamelEvent.ExchangeEvent) event);
+            } else {
+                if (events.size() >= capacity) {
+                    events.poll();
+                }
+                events.offer(event);
+            }
+        }
+
+    }
+}
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/EventHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/EventHelper.java
index a480ee4..dd05188 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/EventHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/EventHelper.java
@@ -844,7 +844,7 @@ public final class EventHelper {
         }
 
         if (((ExtendedExchange) exchange).isNotifyEvent()) {
-            // do not generate events for an notify event
+            // do not generate events for notify event
             return false;
         }