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/28 08:56:55 UTC

[camel] branch main updated (79eb76b3102 -> e98499b8239)

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

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


    from 79eb76b3102 CAMEL-18078: Added doc about ValueInputOption
     new 7c9fcb81541 CAMEL-19396: camel-management - Add DoCatch and DoFinally as managed processors
     new e98499b8239 CAMEL-19396: camel-management - Add DoCatch and DoFinally as managed processors

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../camel/model/ProcessorDefinitionHelper.java     |  11 +-
 .../org/apache/camel/processor/CatchProcessor.java |  67 ++++++++++-
 .../org/apache/camel/processor/TryProcessor.java   |   8 ++
 .../org/apache/camel/reifier/CatchReifier.java     |  16 ++-
 .../org/apache/camel/reifier/FinallyReifier.java   |  13 ++-
 .../apache/camel/reifier/OnExceptionReifier.java   |   2 +-
 .../org/apache/camel/reifier/ProcessorReifier.java |   1 -
 .../api/management/mbean/CamelOpenMBeanTypes.java  |  13 +++
 .../api/management/mbean/ManagedChoiceMBean.java   |   5 +-
 ...edChoiceMBean.java => ManagedDoCatchMBean.java} |  21 +++-
 ...ChoiceMBean.java => ManagedDoFinallyMBean.java} |   9 +-
 ...agedChoiceMBean.java => ManagedDoTryMBean.java} |   7 +-
 .../mbean/ManagedFailoverLoadBalancerMBean.java    |   5 +-
 .../DefaultManagementObjectStrategy.java           |  15 +++
 .../camel/management/mbean/ManagedChoice.java      |   2 +-
 .../camel/management/mbean/ManagedDoCatch.java     |  74 ++++++++++++
 .../camel/management/mbean/ManagedDoFinally.java}  |  29 +++--
 .../camel/management/mbean/ManagedDoTry.java       | 125 +++++++++++++++++++++
 .../mbean/ManagedFailoverLoadBalancer.java         |   2 +-
 .../apache/camel/management/ManagedChoiceTest.java |   2 +-
 ...Test.java => ManagedDoTryCatchFinallyTest.java} |  66 +++++------
 .../ManagedFailoverLoadBalancerTest.java           |   2 +-
 .../ROOT/pages/camel-4-migration-guide.adoc        |   7 ++
 23 files changed, 421 insertions(+), 81 deletions(-)
 copy core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/{ManagedChoiceMBean.java => ManagedDoCatchMBean.java} (55%)
 copy core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/{ManagedChoiceMBean.java => ManagedDoFinallyMBean.java} (73%)
 copy core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/{ManagedChoiceMBean.java => ManagedDoTryMBean.java} (80%)
 create mode 100644 core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedDoCatch.java
 copy core/{camel-core-reifier/src/main/java/org/apache/camel/reifier/FinallyReifier.java => camel-management/src/main/java/org/apache/camel/management/mbean/ManagedDoFinally.java} (53%)
 create mode 100644 core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedDoTry.java
 copy core/camel-management/src/test/java/org/apache/camel/management/{ManagedFailoverLoadBalancerTest.java => ManagedDoTryCatchFinallyTest.java} (58%)


[camel] 02/02: CAMEL-19396: camel-management - Add DoCatch and DoFinally as managed processors

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit e98499b8239142d5290b5e6a9ee0ebc0c907c63d
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sun May 28 10:56:28 2023 +0200

    CAMEL-19396: camel-management - Add DoCatch and DoFinally as managed processors
---
 docs/user-manual/modules/ROOT/pages/camel-4-migration-guide.adoc | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/docs/user-manual/modules/ROOT/pages/camel-4-migration-guide.adoc b/docs/user-manual/modules/ROOT/pages/camel-4-migration-guide.adoc
index 20a4d17d57c..1699f5c4b1b 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-4-migration-guide.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-4-migration-guide.adoc
@@ -115,6 +115,13 @@ Health checks are now by default only readiness checks out of the box.
 Camel provides the `CamelContextCheck` as both readiness and liveness checks, so there is at least
 one of each out of the box.
 
+== JMX
+
+Camel now also include MBeans for `doCatch` and `doFinally` in the tree of processor MBeans.
+
+The `ManagedChoiceMBean` have renamed `choiceStatistics` to `extendedInformation`.
+The `ManagedFailoverLoadBalancerMBean` have renamed `exceptionStatistics` to `extendedInformation`.
+
 == YAML DSL
 
 The backwards compatible mode Camel 3.14 or older, which allowed to have _steps_ as child to _route_ has been removed.


[camel] 01/02: CAMEL-19396: camel-management - Add DoCatch and DoFinally as managed processors

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 7c9fcb8154112deacdca48a940fee4dc72871f35
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sun May 28 10:49:59 2023 +0200

    CAMEL-19396: camel-management - Add DoCatch and DoFinally as managed processors
---
 .../camel/model/ProcessorDefinitionHelper.java     |  11 +-
 .../org/apache/camel/processor/CatchProcessor.java |  67 ++++++++++-
 .../org/apache/camel/processor/TryProcessor.java   |   8 ++
 .../org/apache/camel/reifier/CatchReifier.java     |  16 ++-
 .../org/apache/camel/reifier/FinallyReifier.java   |  13 ++-
 .../apache/camel/reifier/OnExceptionReifier.java   |   2 +-
 .../org/apache/camel/reifier/ProcessorReifier.java |   1 -
 .../api/management/mbean/CamelOpenMBeanTypes.java  |  13 +++
 .../api/management/mbean/ManagedChoiceMBean.java   |   5 +-
 ...edChoiceMBean.java => ManagedDoCatchMBean.java} |  21 +++-
 ...ChoiceMBean.java => ManagedDoFinallyMBean.java} |   9 +-
 ...agedChoiceMBean.java => ManagedDoTryMBean.java} |   7 +-
 .../mbean/ManagedFailoverLoadBalancerMBean.java    |   5 +-
 .../DefaultManagementObjectStrategy.java           |  15 +++
 .../camel/management/mbean/ManagedChoice.java      |   2 +-
 .../camel/management/mbean/ManagedDoCatch.java     |  74 ++++++++++++
 .../camel/management/mbean/ManagedDoFinally.java}  |  29 +++--
 .../camel/management/mbean/ManagedDoTry.java       | 125 +++++++++++++++++++++
 .../mbean/ManagedFailoverLoadBalancer.java         |   2 +-
 .../apache/camel/management/ManagedChoiceTest.java |   2 +-
 ...Test.java => ManagedDoTryCatchFinallyTest.java} |  66 +++++------
 .../ManagedFailoverLoadBalancerTest.java           |   2 +-
 22 files changed, 414 insertions(+), 81 deletions(-)

diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinitionHelper.java b/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinitionHelper.java
index bcb42711f2c..d376c1b5c0a 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinitionHelper.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinitionHelper.java
@@ -335,11 +335,20 @@ public final class ProcessorDefinitionHelper {
 
                     List<CatchDefinition> doTryCatch = doTry.getCatchClauses();
                     for (CatchDefinition doCatch : doTryCatch) {
+                        // ensure to add ourself if we match also
+                        if (type.isInstance(doCatch)) {
+                            found.add((T) doCatch);
+                        }
                         doFindType(doCatch.getOutputs(), type, found, ++current, maxDeep);
                     }
 
                     if (doTry.getFinallyClause() != null) {
-                        doFindType(doTry.getFinallyClause().getOutputs(), type, found, ++current, maxDeep);
+                        // ensure to add ourself if we match also
+                        FinallyDefinition doFinally = doTry.getFinallyClause();
+                        if (type.isInstance(doFinally)) {
+                            found.add((T) doFinally);
+                        }
+                        doFindType(doFinally.getOutputs(), type, found, ++current, maxDeep);
                     }
                 }
 
diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/CatchProcessor.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/CatchProcessor.java
index 90f7c0bad17..53bd9b73214 100644
--- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/CatchProcessor.java
+++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/CatchProcessor.java
@@ -17,8 +17,13 @@
 package org.apache.camel.processor;
 
 import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.camel.AsyncCallback;
+import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
 import org.apache.camel.ExchangePropertyKey;
 import org.apache.camel.Predicate;
@@ -41,17 +46,40 @@ public class CatchProcessor extends DelegateAsyncProcessor implements Traceable,
 
     private static final Logger LOG = LoggerFactory.getLogger(CatchProcessor.class);
 
+    private final CamelContext camelContext;
     private String id;
     private String routeId;
     private final List<Class<? extends Throwable>> exceptions;
+    private boolean extendedStatistics;
+    // to capture how many different exceptions has been caught
+    private ConcurrentMap<String, AtomicLong> exceptionMatches;
     private final Predicate onWhen;
+    private transient long matches;
 
-    public CatchProcessor(List<Class<? extends Throwable>> exceptions, Processor processor, Predicate onWhen) {
+    public CatchProcessor(CamelContext camelContext, List<Class<? extends Throwable>> exceptions, Processor processor,
+                          Predicate onWhen) {
         super(processor);
+        this.camelContext = camelContext;
         this.exceptions = exceptions;
         this.onWhen = onWhen;
     }
 
+    @Override
+    protected void doInit() throws Exception {
+        super.doInit();
+        if (onWhen != null) {
+            onWhen.init(camelContext);
+        }
+        // only if JMX is enabled
+        if (camelContext.getManagementStrategy() != null && camelContext.getManagementStrategy().getManagementAgent() != null) {
+            this.extendedStatistics
+                    = camelContext.getManagementStrategy().getManagementAgent().getStatisticsLevel().isExtended();
+            this.exceptionMatches = new ConcurrentHashMap<>();
+        } else {
+            this.extendedStatistics = false;
+        }
+    }
+
     @Override
     public String toString() {
         return id;
@@ -169,6 +197,12 @@ public class CatchProcessor extends DelegateAsyncProcessor implements Traceable,
             // see if we catch this type
             for (final Class<?> type : exceptions) {
                 if (type.isInstance(e) && matchesWhen(exchange)) {
+                    if (extendedStatistics) {
+                        String fqn = exception.getClass().getName();
+                        AtomicLong match = exceptionMatches.computeIfAbsent(fqn, k -> new AtomicLong());
+                        match.incrementAndGet();
+                    }
+                    matches++;
                     return e;
                 }
             }
@@ -178,8 +212,35 @@ public class CatchProcessor extends DelegateAsyncProcessor implements Traceable,
         return null;
     }
 
-    public List<Class<? extends Throwable>> getExceptions() {
-        return exceptions;
+    /**
+     * Gets the total number of Exchanges that was caught (also matched the onWhen predicate).
+     */
+    public long getCaughtCount() {
+        return matches;
+    }
+
+    /**
+     * Gets the number of Exchanges that was caught by the given exception class name (also matched the onWhen
+     * predicate). This requires to have extended statistics enabled on management statistics level.
+     */
+    public long getCaughtCount(String className) {
+        AtomicLong cnt = exceptionMatches.get(className);
+        return cnt != null ? cnt.get() : 0;
+    }
+
+    /**
+     * Reset counters.
+     */
+    public void reset() {
+        matches = 0;
+        exceptionMatches.values().forEach(c -> c.set(0));
+    }
+
+    /**
+     * Set of the caught exception fully qualified class names
+     */
+    public Set<String> getCaughtExceptionClassNames() {
+        return exceptionMatches.keySet();
     }
 
     /**
diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/TryProcessor.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/TryProcessor.java
index 66e12f3f88b..8db60f2cfcc 100644
--- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/TryProcessor.java
+++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/TryProcessor.java
@@ -143,6 +143,14 @@ public class TryProcessor extends AsyncProcessorSupport implements Navigate<Proc
         ServiceHelper.stopService(tryProcessor, catchClauses, finallyProcessor);
     }
 
+    public List<Processor> getCatchClauses() {
+        return catchClauses;
+    }
+
+    public Processor getFinallyProcessor() {
+        return finallyProcessor;
+    }
+
     @Override
     public List<Processor> next() {
         if (!hasNext()) {
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/CatchReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/CatchReifier.java
index 3890a42f5cd..52be2a9dacb 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/CatchReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/CatchReifier.java
@@ -26,6 +26,8 @@ import org.apache.camel.model.CatchDefinition;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.TryDefinition;
 import org.apache.camel.processor.CatchProcessor;
+import org.apache.camel.spi.IdAware;
+import org.apache.camel.spi.RouteIdAware;
 
 public class CatchReifier extends ProcessorReifier<CatchDefinition> {
 
@@ -34,7 +36,7 @@ public class CatchReifier extends ProcessorReifier<CatchDefinition> {
     }
 
     @Override
-    public CatchProcessor createProcessor() throws Exception {
+    public Processor createProcessor() throws Exception {
         // create and load exceptions if not done
         if (definition.getExceptionClasses() == null) {
             definition.setExceptionClasses(createExceptionClasses());
@@ -58,7 +60,17 @@ public class CatchReifier extends ProcessorReifier<CatchDefinition> {
             when = createPredicate(definition.getOnWhen().getExpression());
         }
 
-        return new CatchProcessor(definition.getExceptionClasses(), childProcessor, when);
+        CatchProcessor processor
+                = new CatchProcessor(getCamelContext(), definition.getExceptionClasses(), childProcessor, when);
+        // inject id
+        if (processor instanceof IdAware) {
+            String id = getId(definition);
+            ((IdAware) processor).setId(id);
+        }
+        if (processor instanceof RouteIdAware) {
+            ((RouteIdAware) processor).setRouteId(route.getRouteId());
+        }
+        return wrapProcessor(processor);
     }
 
     protected List<Class<? extends Throwable>> createExceptionClasses() throws ClassNotFoundException {
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/FinallyReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/FinallyReifier.java
index 5044edea80e..8eac51e20a6 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/FinallyReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/FinallyReifier.java
@@ -22,6 +22,8 @@ import org.apache.camel.model.FinallyDefinition;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.TryDefinition;
 import org.apache.camel.processor.FinallyProcessor;
+import org.apache.camel.spi.IdAware;
+import org.apache.camel.spi.RouteIdAware;
 
 public class FinallyReifier extends ProcessorReifier<FinallyDefinition> {
 
@@ -37,7 +39,16 @@ public class FinallyReifier extends ProcessorReifier<FinallyDefinition> {
         }
 
         // do finally does mandate a child processor
-        return new FinallyProcessor(this.createChildProcessor(false));
+        FinallyProcessor processor = new FinallyProcessor(this.createChildProcessor(false));
+        // inject id
+        if (processor instanceof IdAware) {
+            String id = getId(definition);
+            ((IdAware) processor).setId(id);
+        }
+        if (processor instanceof RouteIdAware) {
+            ((RouteIdAware) processor).setRouteId(route.getRouteId());
+        }
+        return wrapProcessor(processor);
     }
 
 }
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/OnExceptionReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/OnExceptionReifier.java
index 6db1c780899..ec20b975554 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/OnExceptionReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/OnExceptionReifier.java
@@ -83,7 +83,7 @@ public class OnExceptionReifier extends ProcessorReifier<OnExceptionDefinition>
             when = createPredicate(definition.getOnWhen().getExpression());
         }
 
-        return new CatchProcessor(classes, childProcessor, when);
+        return new CatchProcessor(getCamelContext(), classes, childProcessor, when);
     }
 
     protected List<Class<? extends Throwable>> createExceptionClasses(ClassResolver resolver) throws ClassNotFoundException {
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ProcessorReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ProcessorReifier.java
index 7d6209606c9..fa9a2855065 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ProcessorReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ProcessorReifier.java
@@ -831,7 +831,6 @@ public abstract class ProcessorReifier<T extends ProcessorDefinition<?>> extends
         if (processor == null) {
             processor = reifier(route, output).createProcessor();
         }
-
         camelContext.getCamelContextExtension().getStartupStepRecorder().endStep(step);
         return processor;
     }
diff --git a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/CamelOpenMBeanTypes.java b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/CamelOpenMBeanTypes.java
index 665d3c30f31..991a0325d6f 100644
--- a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/CamelOpenMBeanTypes.java
+++ b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/CamelOpenMBeanTypes.java
@@ -175,6 +175,19 @@ public final class CamelOpenMBeanTypes {
                 new OpenType[] { SimpleType.STRING, SimpleType.STRING, SimpleType.LONG });
     }
 
+    public static TabularType doTryTabularType() throws OpenDataException {
+        CompositeType ct = doTryCompositeType();
+        return new TabularType("doTry", "doTry statistics", ct, new String[] { "exception" });
+    }
+
+    public static CompositeType doTryCompositeType() throws OpenDataException {
+        return new CompositeType(
+                "exceptions", "Exception types",
+                new String[] { "exception", "predicate", "language", "matches" },
+                new String[] { "Exception", "Predicate", "Language", "Matches" },
+                new OpenType[] { SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.LONG });
+    }
+
     public static TabularType loadbalancerExceptionsTabularType() throws OpenDataException {
         CompositeType ct = loadbalancerExceptionsCompositeType();
         return new TabularType("exception", "Exception statistics", ct, new String[] { "exception" });
diff --git a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedChoiceMBean.java b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedChoiceMBean.java
index 1cd3577a3d9..e8d7870342c 100644
--- a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedChoiceMBean.java
+++ b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedChoiceMBean.java
@@ -20,9 +20,10 @@ import javax.management.openmbean.TabularData;
 
 import org.apache.camel.api.management.ManagedOperation;
 
-public interface ManagedChoiceMBean extends ManagedProcessorMBean {
+public interface ManagedChoiceMBean extends ManagedProcessorMBean, ManagedExtendedInformation {
 
+    @Override
     @ManagedOperation(description = "Statistics of the content based router for each predicate")
-    TabularData choiceStatistics();
+    TabularData extendedInformation();
 
 }
diff --git a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedChoiceMBean.java b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedDoCatchMBean.java
similarity index 55%
copy from core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedChoiceMBean.java
copy to core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedDoCatchMBean.java
index 1cd3577a3d9..b7bcca1baaa 100644
--- a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedChoiceMBean.java
+++ b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedDoCatchMBean.java
@@ -16,13 +16,24 @@
  */
 package org.apache.camel.api.management.mbean;
 
-import javax.management.openmbean.TabularData;
-
+import org.apache.camel.api.management.ManagedAttribute;
 import org.apache.camel.api.management.ManagedOperation;
 
-public interface ManagedChoiceMBean extends ManagedProcessorMBean {
+public interface ManagedDoCatchMBean extends ManagedProcessorMBean {
+
+    @ManagedAttribute(description = "Predicate that should be true before the onCatch is triggered")
+    String getOnWhen();
+
+    @ManagedAttribute(description = "The language for the predicate")
+    String getOnWhenLanguage();
+
+    @ManagedAttribute(description = "Gets the number of Exchanges that was caught (matches onWhen)")
+    Long getCaughtCount();
+
+    @ManagedOperation(description = "Gets the number of Exchanges that was caught (matches onWhen)")
+    Long getCaughtCount(String className);
 
-    @ManagedOperation(description = "Statistics of the content based router for each predicate")
-    TabularData choiceStatistics();
+    @ManagedAttribute(description = "The class of the exception to catch")
+    String[] getExceptionTypes();
 
 }
diff --git a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedChoiceMBean.java b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedDoFinallyMBean.java
similarity index 73%
copy from core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedChoiceMBean.java
copy to core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedDoFinallyMBean.java
index 1cd3577a3d9..d81a8618c86 100644
--- a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedChoiceMBean.java
+++ b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedDoFinallyMBean.java
@@ -16,13 +16,6 @@
  */
 package org.apache.camel.api.management.mbean;
 
-import javax.management.openmbean.TabularData;
-
-import org.apache.camel.api.management.ManagedOperation;
-
-public interface ManagedChoiceMBean extends ManagedProcessorMBean {
-
-    @ManagedOperation(description = "Statistics of the content based router for each predicate")
-    TabularData choiceStatistics();
+public interface ManagedDoFinallyMBean extends ManagedProcessorMBean {
 
 }
diff --git a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedChoiceMBean.java b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedDoTryMBean.java
similarity index 80%
copy from core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedChoiceMBean.java
copy to core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedDoTryMBean.java
index 1cd3577a3d9..498f4288415 100644
--- a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedChoiceMBean.java
+++ b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedDoTryMBean.java
@@ -20,9 +20,10 @@ import javax.management.openmbean.TabularData;
 
 import org.apache.camel.api.management.ManagedOperation;
 
-public interface ManagedChoiceMBean extends ManagedProcessorMBean {
+public interface ManagedDoTryMBean extends ManagedProcessorMBean, ManagedExtendedInformation {
 
-    @ManagedOperation(description = "Statistics of the content based router for each predicate")
-    TabularData choiceStatistics();
+    @Override
+    @ManagedOperation(description = "Statistics of the doTry for each caught exception")
+    TabularData extendedInformation();
 
 }
diff --git a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedFailoverLoadBalancerMBean.java b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedFailoverLoadBalancerMBean.java
index 3af0c1d78b2..bc80a5b31ca 100644
--- a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedFailoverLoadBalancerMBean.java
+++ b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedFailoverLoadBalancerMBean.java
@@ -21,7 +21,7 @@ import javax.management.openmbean.TabularData;
 import org.apache.camel.api.management.ManagedAttribute;
 import org.apache.camel.api.management.ManagedOperation;
 
-public interface ManagedFailoverLoadBalancerMBean extends ManagedProcessorMBean {
+public interface ManagedFailoverLoadBalancerMBean extends ManagedProcessorMBean, ManagedExtendedInformation {
 
     @ManagedAttribute(description = "Number of processors in the load balancer")
     Integer getSize();
@@ -41,7 +41,8 @@ public interface ManagedFailoverLoadBalancerMBean extends ManagedProcessorMBean
     @ManagedAttribute(description = "Processor id of the last known good processor that succeed processing the exchange")
     String getLastGoodProcessorId();
 
+    @Override
     @ManagedOperation(description = "Statistics of the content based router for each exception")
-    TabularData exceptionStatistics();
+    TabularData extendedInformation();
 
 }
diff --git a/core/camel-management/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java b/core/camel-management/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java
index fc234018808..2338ad1bc89 100644
--- a/core/camel-management/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java
+++ b/core/camel-management/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java
@@ -48,6 +48,9 @@ import org.apache.camel.management.mbean.ManagedCustomLoadBalancer;
 import org.apache.camel.management.mbean.ManagedDataFormat;
 import org.apache.camel.management.mbean.ManagedDelayer;
 import org.apache.camel.management.mbean.ManagedDisabled;
+import org.apache.camel.management.mbean.ManagedDoCatch;
+import org.apache.camel.management.mbean.ManagedDoFinally;
+import org.apache.camel.management.mbean.ManagedDoTry;
 import org.apache.camel.management.mbean.ManagedDynamicRouter;
 import org.apache.camel.management.mbean.ManagedEndpoint;
 import org.apache.camel.management.mbean.ManagedEnricher;
@@ -103,9 +106,11 @@ import org.apache.camel.management.mbean.ManagedValidate;
 import org.apache.camel.management.mbean.ManagedWeightedLoadBalancer;
 import org.apache.camel.management.mbean.ManagedWireTapProcessor;
 import org.apache.camel.model.AggregateDefinition;
+import org.apache.camel.model.CatchDefinition;
 import org.apache.camel.model.DynamicRouterDefinition;
 import org.apache.camel.model.EnrichDefinition;
 import org.apache.camel.model.ExpressionNode;
+import org.apache.camel.model.FinallyDefinition;
 import org.apache.camel.model.IdempotentConsumerDefinition;
 import org.apache.camel.model.LoadBalanceDefinition;
 import org.apache.camel.model.LoopDefinition;
@@ -121,9 +126,11 @@ import org.apache.camel.model.SetHeaderDefinition;
 import org.apache.camel.model.SetPropertyDefinition;
 import org.apache.camel.model.SplitDefinition;
 import org.apache.camel.model.TransformDefinition;
+import org.apache.camel.model.TryDefinition;
 import org.apache.camel.model.UnmarshalDefinition;
 import org.apache.camel.model.ValidateDefinition;
 import org.apache.camel.model.loadbalancer.CustomLoadBalancerDefinition;
+import org.apache.camel.processor.CatchProcessor;
 import org.apache.camel.processor.ChoiceProcessor;
 import org.apache.camel.processor.ClaimCheckProcessor;
 import org.apache.camel.processor.Delayer;
@@ -132,6 +139,7 @@ import org.apache.camel.processor.DynamicRouter;
 import org.apache.camel.processor.Enricher;
 import org.apache.camel.processor.ExchangePatternProcessor;
 import org.apache.camel.processor.FilterProcessor;
+import org.apache.camel.processor.FinallyProcessor;
 import org.apache.camel.processor.LogProcessor;
 import org.apache.camel.processor.LoopProcessor;
 import org.apache.camel.processor.MulticastProcessor;
@@ -160,6 +168,7 @@ import org.apache.camel.processor.ThreadsProcessor;
 import org.apache.camel.processor.Throttler;
 import org.apache.camel.processor.ThrowExceptionProcessor;
 import org.apache.camel.processor.TransformProcessor;
+import org.apache.camel.processor.TryProcessor;
 import org.apache.camel.processor.WireTapProcessor;
 import org.apache.camel.processor.aggregate.AggregateProcessor;
 import org.apache.camel.processor.idempotent.IdempotentConsumer;
@@ -348,6 +357,12 @@ public class DefaultManagementObjectStrategy implements ManagementObjectStrategy
                 answer = new ManagedDelayer(context, (Delayer) target, definition);
             } else if (target instanceof DisabledProcessor) {
                 answer = new ManagedDisabled(context, (DisabledProcessor) target, definition);
+            } else if (target instanceof TryProcessor) {
+                answer = new ManagedDoTry(context, (TryProcessor) target, (TryDefinition) definition);
+            } else if (target instanceof CatchProcessor) {
+                answer = new ManagedDoCatch(context, (CatchProcessor) target, (CatchDefinition) definition);
+            } else if (target instanceof FinallyProcessor) {
+                answer = new ManagedDoFinally(context, (FinallyProcessor) target, (FinallyDefinition) definition);
             } else if (target instanceof Throttler) {
                 answer = new ManagedThrottler(context, (Throttler) target, definition);
             } else if (target instanceof DynamicRouter) {
diff --git a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedChoice.java b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedChoice.java
index 0464156c5d2..2ec5fc52083 100644
--- a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedChoice.java
+++ b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedChoice.java
@@ -61,7 +61,7 @@ public class ManagedChoice extends ManagedProcessor implements ManagedChoiceMBea
     }
 
     @Override
-    public TabularData choiceStatistics() {
+    public TabularData extendedInformation() {
         try {
             TabularData answer = new TabularDataSupport(CamelOpenMBeanTypes.choiceTabularType());
 
diff --git a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedDoCatch.java b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedDoCatch.java
new file mode 100644
index 00000000000..ef2aba1969a
--- /dev/null
+++ b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedDoCatch.java
@@ -0,0 +1,74 @@
+/*
+ * 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 org.apache.camel.CamelContext;
+import org.apache.camel.api.management.ManagedResource;
+import org.apache.camel.api.management.mbean.ManagedDoCatchMBean;
+import org.apache.camel.model.CatchDefinition;
+import org.apache.camel.model.WhenDefinition;
+import org.apache.camel.processor.CatchProcessor;
+
+@ManagedResource(description = "Managed DoCatch")
+public class ManagedDoCatch extends ManagedProcessor implements ManagedDoCatchMBean {
+
+    private final CatchProcessor processor;
+
+    public ManagedDoCatch(CamelContext context, CatchProcessor processor, CatchDefinition definition) {
+        super(context, processor, definition);
+        this.processor = processor;
+    }
+
+    @Override
+    public CatchDefinition getDefinition() {
+        return (CatchDefinition) super.getDefinition();
+    }
+
+    @Override
+    public String getOnWhen() {
+        WhenDefinition when = getDefinition().getOnWhen();
+        if (when != null) {
+            return when.getExpression().getExpression();
+        }
+        return null;
+    }
+
+    @Override
+    public String getOnWhenLanguage() {
+        WhenDefinition when = getDefinition().getOnWhen();
+        if (when != null) {
+            return when.getExpression().getLanguage();
+        }
+        return null;
+    }
+
+    @Override
+    public Long getCaughtCount() {
+        return processor.getCaughtCount();
+    }
+
+    @Override
+    public Long getCaughtCount(String className) {
+        return processor.getCaughtCount(className);
+    }
+
+    @Override
+    public String[] getExceptionTypes() {
+        return processor.getCaughtExceptionClassNames().toArray(new String[0]);
+    }
+
+}
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/FinallyReifier.java b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedDoFinally.java
similarity index 53%
copy from core/camel-core-reifier/src/main/java/org/apache/camel/reifier/FinallyReifier.java
copy to core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedDoFinally.java
index 5044edea80e..895b5be975d 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/FinallyReifier.java
+++ b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedDoFinally.java
@@ -14,30 +14,27 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.reifier;
+package org.apache.camel.management.mbean;
 
-import org.apache.camel.Processor;
-import org.apache.camel.Route;
+import org.apache.camel.CamelContext;
+import org.apache.camel.api.management.ManagedResource;
+import org.apache.camel.api.management.mbean.ManagedDoFinallyMBean;
 import org.apache.camel.model.FinallyDefinition;
-import org.apache.camel.model.ProcessorDefinition;
-import org.apache.camel.model.TryDefinition;
 import org.apache.camel.processor.FinallyProcessor;
 
-public class FinallyReifier extends ProcessorReifier<FinallyDefinition> {
+@ManagedResource(description = "Managed DoFinally")
+public class ManagedDoFinally extends ManagedProcessor implements ManagedDoFinallyMBean {
 
-    public FinallyReifier(Route route, ProcessorDefinition<?> definition) {
-        super(route, FinallyDefinition.class.cast(definition));
+    private final FinallyProcessor processor;
+
+    public ManagedDoFinally(CamelContext context, FinallyProcessor processor, FinallyDefinition definition) {
+        super(context, processor, definition);
+        this.processor = processor;
     }
 
     @Override
-    public Processor createProcessor() throws Exception {
-        // parent must be a try
-        if (!(definition.getParent() instanceof TryDefinition)) {
-            throw new IllegalArgumentException("This doFinally should have a doTry as its parent on " + definition);
-        }
-
-        // do finally does mandate a child processor
-        return new FinallyProcessor(this.createChildProcessor(false));
+    public FinallyDefinition getDefinition() {
+        return (FinallyDefinition) super.getDefinition();
     }
 
 }
diff --git a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedDoTry.java b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedDoTry.java
new file mode 100644
index 00000000000..c05e7b856d0
--- /dev/null
+++ b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedDoTry.java
@@ -0,0 +1,125 @@
+/*
+ * 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.ArrayList;
+import java.util.List;
+
+import javax.management.openmbean.CompositeData;
+import javax.management.openmbean.CompositeDataSupport;
+import javax.management.openmbean.CompositeType;
+import javax.management.openmbean.TabularData;
+import javax.management.openmbean.TabularDataSupport;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Channel;
+import org.apache.camel.Navigate;
+import org.apache.camel.Processor;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.api.management.ManagedResource;
+import org.apache.camel.api.management.mbean.CamelOpenMBeanTypes;
+import org.apache.camel.api.management.mbean.ManagedDoTryMBean;
+import org.apache.camel.model.CatchDefinition;
+import org.apache.camel.model.TryDefinition;
+import org.apache.camel.processor.CatchProcessor;
+import org.apache.camel.processor.TryProcessor;
+
+@ManagedResource(description = "Managed DoTry")
+public class ManagedDoTry extends ManagedProcessor implements ManagedDoTryMBean {
+
+    private final TryProcessor processor;
+    private final List<CatchProcessor> catchProcessors;
+
+    public ManagedDoTry(CamelContext context, TryProcessor processor, TryDefinition definition) {
+        super(context, processor, definition);
+        this.processor = processor;
+
+        if (processor.getCatchClauses() != null) {
+            catchProcessors = new ArrayList<>();
+            for (Processor p : processor.getCatchClauses()) {
+                Channel c = (Channel) p;
+                CatchProcessor caught = asCatchProcessor(c);
+                catchProcessors.add(caught);
+            }
+        } else {
+            catchProcessors = null;
+        }
+    }
+
+    @Override
+    public TryDefinition getDefinition() {
+        return (TryDefinition) super.getDefinition();
+    }
+
+    @Override
+    public Boolean getSupportExtendedInformation() {
+        return true;
+    }
+
+    @Override
+    public TabularData extendedInformation() {
+        try {
+            TabularData answer = new TabularDataSupport(CamelOpenMBeanTypes.doTryTabularType());
+
+            if (catchProcessors != null) {
+                List<CatchDefinition> exceptions = getDefinition().getCatchClauses();
+                for (int i = 0; i < catchProcessors.size(); i++) {
+                    CatchDefinition when = exceptions.get(i);
+                    CatchProcessor caught = catchProcessors.get(i);
+                    if (caught != null) {
+                        for (String fqn : caught.getCaughtExceptionClassNames()) {
+                            CompositeType ct = CamelOpenMBeanTypes.doTryCompositeType();
+                            String predicate = null;
+                            String language = null;
+                            if (when.getOnWhen() != null) {
+                                predicate = when.getOnWhen().getExpression().getExpression();
+                                language = when.getOnWhen().getExpression().getLanguage();
+                            }
+                            long matches = caught.getCaughtCount(fqn);
+
+                            CompositeData data = new CompositeDataSupport(
+                                    ct,
+                                    new String[] { "exception", "predicate", "language", "matches" },
+                                    new Object[] { fqn, predicate, language, matches });
+                            answer.put(data);
+                        }
+                    }
+                }
+            }
+            return answer;
+        } catch (Exception e) {
+            throw RuntimeCamelException.wrapRuntimeCamelException(e);
+        }
+    }
+
+    private CatchProcessor asCatchProcessor(Navigate<Processor> nav) {
+        // drill down and find
+        while (nav.hasNext()) {
+            for (Processor p : nav.next()) {
+                if (p instanceof CatchProcessor) {
+                    return (CatchProcessor) p;
+                }
+                if (p instanceof Navigate<?>) {
+                    Navigate<Processor> child = (Navigate<Processor>) p;
+                    return asCatchProcessor(child);
+                }
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedFailoverLoadBalancer.java b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedFailoverLoadBalancer.java
index 0cf81db93f3..0523356fbd7 100644
--- a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedFailoverLoadBalancer.java
+++ b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedFailoverLoadBalancer.java
@@ -116,7 +116,7 @@ public class ManagedFailoverLoadBalancer extends ManagedProcessor implements Man
     }
 
     @Override
-    public TabularData exceptionStatistics() {
+    public TabularData extendedInformation() {
         try {
             TabularData answer = new TabularDataSupport(CamelOpenMBeanTypes.loadbalancerExceptionsTabularType());
 
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedChoiceTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedChoiceTest.java
index 5ea1d96b866..067ee2ac946 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedChoiceTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedChoiceTest.java
@@ -63,7 +63,7 @@ public class ManagedChoiceTest extends ManagementTestSupport {
         int level = (Integer) mbeanServer.getAttribute(on, "Level");
         assertEquals(1, level);
 
-        TabularData data = (TabularData) mbeanServer.invoke(on, "choiceStatistics", null, null);
+        TabularData data = (TabularData) mbeanServer.invoke(on, "extendedInformation", null, null);
         assertNotNull(data);
         assertEquals(2, data.size());
 
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedFailoverLoadBalancerTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedDoTryCatchFinallyTest.java
similarity index 58%
copy from core/camel-management/src/test/java/org/apache/camel/management/ManagedFailoverLoadBalancerTest.java
copy to core/camel-management/src/test/java/org/apache/camel/management/ManagedDoTryCatchFinallyTest.java
index af3a812703d..6ff8ee78ccd 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedFailoverLoadBalancerTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedDoTryCatchFinallyTest.java
@@ -17,15 +17,15 @@
 package org.apache.camel.management;
 
 import java.io.IOException;
-import java.sql.SQLException;
 
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
 import javax.management.openmbean.TabularData;
 
+import org.apache.camel.CamelContext;
+import org.apache.camel.ManagementStatisticsLevel;
 import org.apache.camel.ServiceStatus;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.condition.DisabledOnOs;
 import org.junit.jupiter.api.condition.OS;
@@ -35,18 +35,21 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 @DisabledOnOs(OS.AIX)
-public class ManagedFailoverLoadBalancerTest extends ManagementTestSupport {
+public class ManagedDoTryCatchFinallyTest extends ManagementTestSupport {
 
-    @Test
-    public void testManageFailoverLoadBalancer() throws Exception {
-        getMockEndpoint("mock:foo").whenAnyExchangeReceived(exchange -> {
-            throw new IOException("Forced");
-        });
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = super.createCamelContext();
+        context.getManagementStrategy().getManagementAgent().setStatisticsLevel(ManagementStatisticsLevel.Extended);
+        return context;
+    }
 
-        MockEndpoint bar = getMockEndpoint("mock:bar");
-        bar.expectedMessageCount(1);
+    @Test
+    public void testManageTryCatchFinally() throws Exception {
+        getMockEndpoint("mock:start").expectedMessageCount(1);
+        getMockEndpoint("mock:finally").expectedMessageCount(1);
 
-        template.sendBodyAndHeader("direct:start", "Hello World", "foo", "123");
+        template.sendBody("direct:start", "Hello World");
 
         assertMockEndpointsSatisfied();
 
@@ -54,7 +57,7 @@ public class ManagedFailoverLoadBalancerTest extends ManagementTestSupport {
         MBeanServer mbeanServer = getMBeanServer();
 
         // get the object name for the delayer
-        ObjectName on = getCamelObjectName(TYPE_PROCESSOR, "mysend");
+        ObjectName on = getCamelObjectName(TYPE_PROCESSOR, "myDoCatch2");
 
         // should be on route1
         String routeId = (String) mbeanServer.getAttribute(on, "RouteId");
@@ -66,27 +69,18 @@ public class ManagedFailoverLoadBalancerTest extends ManagementTestSupport {
         String state = (String) mbeanServer.getAttribute(on, "State");
         assertEquals(ServiceStatus.Started.name(), state);
 
-        Integer size = (Integer) mbeanServer.getAttribute(on, "Size");
-        assertEquals(2, size.intValue());
-
-        Boolean roundRobin = (Boolean) mbeanServer.getAttribute(on, "RoundRobin");
-        assertEquals(true, roundRobin.booleanValue());
-
-        Boolean sticky = (Boolean) mbeanServer.getAttribute(on, "Sticky");
-        assertEquals(true, sticky.booleanValue());
-
-        Integer attempts = (Integer) mbeanServer.getAttribute(on, "MaximumFailoverAttempts");
-        assertEquals(3, attempts.intValue());
-
-        String exceptions = (String) mbeanServer.getAttribute(on, "Exceptions");
-        assertEquals("java.io.IOException,java.sql.SQLException", exceptions);
+        Long count = (Long) mbeanServer.getAttribute(on, "CaughtCount");
+        assertEquals(1, count.longValue());
 
-        String id = (String) mbeanServer.getAttribute(on, "LastGoodProcessorId");
-        assertEquals("bar", id);
+        // the 1st doCatch should not catch anything
+        on = getCamelObjectName(TYPE_PROCESSOR, "myDoCatch1");
+        count = (Long) mbeanServer.getAttribute(on, "CaughtCount");
+        assertEquals(0, count.longValue());
 
-        TabularData data = (TabularData) mbeanServer.invoke(on, "exceptionStatistics", null, null);
+        on = getCamelObjectName(TYPE_PROCESSOR, "myDoTry1");
+        TabularData data = (TabularData) mbeanServer.invoke(on, "extendedInformation", null, null);
         assertNotNull(data);
-        assertEquals(2, data.size());
+        assertEquals(1, data.size());
     }
 
     @Override
@@ -95,8 +89,16 @@ public class ManagedFailoverLoadBalancerTest extends ManagementTestSupport {
             @Override
             public void configure() throws Exception {
                 from("direct:start")
-                        .loadBalance().failover(3, false, true, true, IOException.class, SQLException.class).id("mysend")
-                        .to("mock:foo").id("foo").to("mock:bar").id("bar");
+                    .doTry().id("myDoTry1")
+                        .to("mock:start")
+                        .throwException(new IllegalArgumentException("Forced"))
+                    .doCatch(IOException.class).id("myDoCatch1")
+                        .to("mock:io")
+                    .doCatch(IllegalArgumentException.class).id("myDoCatch2")
+                        .to("mock:iae")
+                    .doFinally()
+                        .to("mock:finally")
+                    .end();
             }
         };
     }
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedFailoverLoadBalancerTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedFailoverLoadBalancerTest.java
index af3a812703d..90ec1f34289 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedFailoverLoadBalancerTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedFailoverLoadBalancerTest.java
@@ -84,7 +84,7 @@ public class ManagedFailoverLoadBalancerTest extends ManagementTestSupport {
         String id = (String) mbeanServer.getAttribute(on, "LastGoodProcessorId");
         assertEquals("bar", id);
 
-        TabularData data = (TabularData) mbeanServer.invoke(on, "exceptionStatistics", null, null);
+        TabularData data = (TabularData) mbeanServer.invoke(on, "extendedInformation", null, null);
         assertNotNull(data);
         assertEquals(2, data.size());
     }