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 2012/01/17 10:47:26 UTC

svn commit: r1232367 - in /camel/trunk: camel-core/src/main/java/org/apache/camel/ camel-core/src/main/java/org/apache/camel/impl/ camel-core/src/main/java/org/apache/camel/management/ camel-core/src/main/java/org/apache/camel/spi/ camel-core/src/test/...

Author: davsclaus
Date: Tue Jan 17 09:47:25 2012
New Revision: 1232367

URL: http://svn.apache.org/viewvc?rev=1232367&view=rev
Log:
CAMEL-4906: Allow to easily configure JMX naming using managementNamePattern attribute on CamelContext.

Added:
    camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultManagementNameStrategy.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ManagementNameStrategy.java
      - copied, changed from r1232308, camel/trunk/camel-core/src/main/java/org/apache/camel/spi/CamelContextNameStrategy.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/management/ManagedNamePatternFixedTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/management/ManagedNamePatternTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/management/TwoManagedNamePatternTest.java   (contents, props changed)
      - copied, changed from r1232308, camel/trunk/camel-core/src/test/java/org/apache/camel/management/TwoManagedCamelContextTest.java
    camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiManagementNameStrategy.java
    camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/management/SpringManagedNamePatternFixedTest.java
    camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/management/SpringManagedNamePatternTest.java
      - copied, changed from r1232308, camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/management/SpringManagedStatisticsLevelOffTest.java
    camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/SpringManagedNamePatternFixedTest.xml
    camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/SpringManagedNamePatternTest.xml
      - copied, changed from r1232308, camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/SpringManagedStatisticsLevelOffTest.xml
    camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/blueprint/CamelBlueprintManagedNamePatternFixedTest.java
      - copied, changed from r1232332, camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/blueprint/CamelBlueprint5Test.java
    camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/blueprint/blueprint-fixed.xml
      - copied, changed from r1232332, camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/blueprint/blueprint-23.xml
Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContextNameStrategy.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ExplicitCamelContextNameStrategy.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultManagementNamingStrategy.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/spi/CamelContextNameStrategy.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ManagementNamingStrategy.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/management/TwoManagedCamelContextAutoAssignedNameClashTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/management/TwoManagedCamelContextClashTest.java
    camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java
    camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java
    camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextHelper.java
    camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiDefaultCamelContext.java
    camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
    camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java?rev=1232367&r1=1232366&r2=1232367&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java Tue Jan 17 09:47:25 2012
@@ -41,6 +41,7 @@ import org.apache.camel.spi.InterceptStr
 import org.apache.camel.spi.Language;
 import org.apache.camel.spi.LifecycleStrategy;
 import org.apache.camel.spi.ManagementMBeanAssembler;
+import org.apache.camel.spi.ManagementNameStrategy;
 import org.apache.camel.spi.ManagementStrategy;
 import org.apache.camel.spi.NodeIdFactory;
 import org.apache.camel.spi.PackageScanClassResolver;
@@ -99,6 +100,20 @@ public interface CamelContext extends Su
     void setNameStrategy(CamelContextNameStrategy nameStrategy);
 
     /**
+     * Gets the current management name strategy
+     *
+     * @return management name strategy
+     */
+    ManagementNameStrategy getManagementNameStrategy();
+
+    /**
+     * Sets a custom management name strategy
+     *
+     * @param nameStrategy name strategy
+     */
+    void setManagementNameStrategy(ManagementNameStrategy nameStrategy);
+
+    /**
      * Gets the name this {@link CamelContext} was registered in JMX.
      * <p/>
      * The reason that a {@link CamelContext} can have a different name in JMX is the fact to remedy for name clash
@@ -110,13 +125,6 @@ public interface CamelContext extends Su
     String getManagementName();
 
     /**
-     * Sets the name this {@link CamelContext} was registered in JMX.
-     *
-     * @param name  the actual name used when registering this {@link CamelContext} in JMX
-     */
-    void setManagementName(String name);
-
-    /**
      * Gets the version of the this context.
      *
      * @return the version

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java?rev=1232367&r1=1232366&r2=1232367&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java Tue Jan 17 09:47:25 2012
@@ -102,6 +102,7 @@ import org.apache.camel.spi.Language;
 import org.apache.camel.spi.LanguageResolver;
 import org.apache.camel.spi.LifecycleStrategy;
 import org.apache.camel.spi.ManagementMBeanAssembler;
+import org.apache.camel.spi.ManagementNameStrategy;
 import org.apache.camel.spi.ManagementStrategy;
 import org.apache.camel.spi.NodeIdFactory;
 import org.apache.camel.spi.PackageScanClassResolver;
@@ -136,6 +137,7 @@ public class DefaultCamelContext extends
     private final transient Logger log = LoggerFactory.getLogger(getClass());
     private JAXBContext jaxbContext;
     private CamelContextNameStrategy nameStrategy = new DefaultCamelContextNameStrategy();
+    private ManagementNameStrategy managementNameStrategy = new DefaultManagementNameStrategy(this);
     private String managementName;
     private ClassLoader applicationContextClassLoader;
     private Map<EndpointKey, Endpoint> endpoints;
@@ -260,6 +262,14 @@ public class DefaultCamelContext extends
         this.nameStrategy = nameStrategy;
     }
 
+    public ManagementNameStrategy getManagementNameStrategy() {
+        return managementNameStrategy;
+    }
+
+    public void setManagementNameStrategy(ManagementNameStrategy managementNameStrategy) {
+        this.managementNameStrategy = managementNameStrategy;
+    }
+
     public String getManagementName() {
         return managementName;
     }
@@ -2426,6 +2436,7 @@ public class DefaultCamelContext extends
      */
     public static void setContextCounter(int value) {
         DefaultCamelContextNameStrategy.setCounter(value);
+        DefaultManagementNameStrategy.setCounter(value);
     }
 
     private static UuidGenerator createDefaultUuidGenerator() {

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContextNameStrategy.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContextNameStrategy.java?rev=1232367&r1=1232366&r2=1232367&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContextNameStrategy.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContextNameStrategy.java Tue Jan 17 09:47:25 2012
@@ -40,6 +40,7 @@ public class DefaultCamelContextNameStra
         this.name = getNextName();
     }
 
+    @Override
     public String getName() {
         if (name == null) {
             name = getNextName();
@@ -47,10 +48,16 @@ public class DefaultCamelContextNameStra
         return name;
     }
 
+    @Override
     public String getNextName() {
         return prefix + "-" + getNextCounter();
     }
 
+    @Override
+    public boolean isFixedName() {
+        return false;
+    }
+
     public static int getNextCounter() {
         return CONTEXT_COUNTER.incrementAndGet();
     }

Added: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultManagementNameStrategy.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultManagementNameStrategy.java?rev=1232367&view=auto
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultManagementNameStrategy.java (added)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultManagementNameStrategy.java Tue Jan 17 09:47:25 2012
@@ -0,0 +1,166 @@
+/**
+ * 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;
+
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ManagementNameStrategy;
+import org.apache.camel.util.ObjectHelper;
+
+/**
+ * Default implementation of {@link ManagementNameStrategy}
+ * <p/>
+ * This implementation will by default use a name pattern as <tt>#name#</tt> and in case
+ * of a clash, then the pattern will fallback to be using the counter as <tt>#name#-#counter#</tt>.
+ */
+public class DefaultManagementNameStrategy implements ManagementNameStrategy {
+
+    private static final Pattern INVALID_PATTERN = Pattern.compile(".*#\\w+#.*");
+    private static final AtomicLong NAME_COUNTER = new AtomicLong();
+
+    private final CamelContext camelContext;
+    private final String defaultPattern;
+    private final String nextPattern;
+    private String name;
+    private String namePattern;
+
+    public DefaultManagementNameStrategy(CamelContext camelContext) {
+        this(camelContext, "#name#", "#name#-#counter#");
+    }
+
+    public DefaultManagementNameStrategy(CamelContext camelContext, String defaultPattern, String nextPattern) {
+        this.camelContext = camelContext;
+        this.defaultPattern = defaultPattern;
+        this.nextPattern = nextPattern;
+    }
+
+    @Override
+    public String getNamePattern() {
+        return namePattern;
+    }
+
+    @Override
+    public void setNamePattern(String namePattern) {
+        this.namePattern = namePattern;
+    }
+
+    @Override
+    public String getName() {
+        if (name == null) {
+            String pattern = getNamePattern();
+            if (pattern == null) {
+                // fallback and use the default pattern which is the same name as the CamelContext has been given
+                pattern = defaultPattern;
+            }
+            name = resolveManagementName(pattern, camelContext.getName());
+        }
+        return name;
+    }
+
+    @Override
+    public String getNextName() {
+        if (isFixedName()) {
+            // use the fixed name
+            return getName();
+        } else {
+            // or resolve a new name
+            String pattern = getNamePattern();
+            if (pattern == null) {
+                // use a pattern that has a counter to ensure unique next name
+                pattern = nextPattern;
+            }
+            return resolveManagementName(pattern, camelContext.getName());
+        }
+    }
+
+    @Override
+    public boolean isFixedName() {
+        // the name will be fixed unless there is a counter token
+        String pattern = getNamePattern();
+        if (pattern == null) {
+            // we are not fixed by default
+            return false;
+        }
+        return !pattern.contains("#counter#");
+    }
+
+    /**
+     * Creates a new management name with the given pattern
+     *
+     * @param pattern the pattern
+     * @param name    the name
+     * @return the management name
+     * @throws IllegalArgumentException if the pattern or name is invalid or empty
+     */
+    protected String resolveManagementName(String pattern, String name) {
+        ObjectHelper.notEmpty(pattern, "pattern");
+        ObjectHelper.notEmpty(name, "name");
+
+        // must quote the names to have it work as literal replacement
+        name = Matcher.quoteReplacement(name);
+
+        // replace tokens
+        String answer = pattern;
+        if (pattern.contains("#counter#")) {
+            // only increment the counter on-demand
+            answer = pattern.replaceFirst("#counter#", "" + nextNameCounter());
+        }
+        // camelId and name is the same tokens
+        answer = answer.replaceFirst("#camelId#", name);
+        answer = answer.replaceFirst("#name#", name);
+
+        // allow custom name resolution as well. For example with camel-core-osgi we have a custom
+        // name strategy that supports OSGI specific tokens such as #bundleId# etc.
+        answer = customResolveManagementName(pattern, answer);
+
+        // are there any #word# combos left, if so they should be considered invalid tokens
+        if (INVALID_PATTERN.matcher(answer).matches()) {
+            throw new IllegalArgumentException("Pattern is invalid: " + pattern);
+        }
+
+        return answer;
+    }
+
+    /**
+     * Strategy to do any custom resolution of the name
+     *
+     * @param pattern  the pattern
+     * @param answer   the current answer, which may have custom patterns still to be resolved
+     * @return the resolved name
+     */
+    protected String customResolveManagementName(String pattern, String answer) {
+        return answer;
+    }
+
+    private static long nextNameCounter() {
+        // we want to be 1-based, so increment first
+        return NAME_COUNTER.incrementAndGet();
+    }
+
+    /**
+     * To reset the counter, should only be used for testing purposes.
+     *
+     * @param value the counter value
+     */
+    public static void setCounter(int value) {
+        NAME_COUNTER.set(value);
+    }
+
+}

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ExplicitCamelContextNameStrategy.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ExplicitCamelContextNameStrategy.java?rev=1232367&r1=1232366&r2=1232367&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ExplicitCamelContextNameStrategy.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/ExplicitCamelContextNameStrategy.java Tue Jan 17 09:47:25 2012
@@ -33,7 +33,18 @@ public class ExplicitCamelContextNameStr
         this.name = name;
     }
 
+    @Override
     public String getName() {
         return name;
     }
+
+    @Override
+    public String getNextName() {
+        return name;
+    }
+
+    @Override
+    public boolean isFixedName() {
+        return true;
+    }
 }

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java?rev=1232367&r1=1232366&r2=1232367&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java Tue Jan 17 09:47:25 2012
@@ -45,10 +45,9 @@ import org.apache.camel.TimerListener;
 import org.apache.camel.VetoCamelContextStartException;
 import org.apache.camel.api.management.PerformanceCounter;
 import org.apache.camel.impl.ConsumerCache;
-import org.apache.camel.impl.DefaultCamelContextNameStrategy;
+import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.impl.EndpointRegistry;
 import org.apache.camel.impl.EventDrivenConsumerRoute;
-import org.apache.camel.impl.ExplicitCamelContextNameStrategy;
 import org.apache.camel.impl.ProducerCache;
 import org.apache.camel.impl.ThrottlingInflightRoutePolicy;
 import org.apache.camel.management.mbean.ManagedConsumerCache;
@@ -66,11 +65,11 @@ import org.apache.camel.model.PolicyDefi
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.processor.interceptor.Tracer;
-import org.apache.camel.spi.CamelContextNameStrategy;
 import org.apache.camel.spi.EventNotifier;
 import org.apache.camel.spi.LifecycleStrategy;
 import org.apache.camel.spi.ManagementAgent;
 import org.apache.camel.spi.ManagementAware;
+import org.apache.camel.spi.ManagementNameStrategy;
 import org.apache.camel.spi.ManagementObjectStrategy;
 import org.apache.camel.spi.ManagementStrategy;
 import org.apache.camel.spi.RouteContext;
@@ -121,12 +120,13 @@ public class DefaultManagementLifecycleS
     public void onContextStart(CamelContext context) throws VetoCamelContextStartException {
         Object mc = getManagementObjectStrategy().getManagedObjectForCamelContext(context);
 
-        String managementName = context.getManagementName() != null ? context.getManagementName() : context.getName();
+        String name = context.getName();
+        String managementName = context.getManagementNameStrategy().getName();
 
         try {
             boolean done = false;
             while (!done) {
-                ObjectName on = getManagementStrategy().getManagementNamingStrategy().getObjectNameForCamelContext(context);
+                ObjectName on = getManagementStrategy().getManagementNamingStrategy().getObjectNameForCamelContext(managementName, name);
                 boolean exists = getManagementStrategy().isManaged(mc, on);
                 if (!exists) {
                     done = true;
@@ -134,28 +134,20 @@ public class DefaultManagementLifecycleS
                     // okay there exists already a CamelContext with this name, we can try to fix it by finding a free name
                     boolean fixed = false;
                     // if we use the default name strategy we can find a free name to use
-                    String name = findFreeName(mc, context.getNameStrategy(), managementName);
-                    if (name != null) {
+                    String newName = findFreeName(mc, context.getManagementNameStrategy(), name);
+                    if (newName != null) {
                         // use this as the fixed name
                         fixed = true;
                         done = true;
-                        managementName = name;
+                        managementName = newName;
                     }
                     // we could not fix it so veto starting camel
                     if (!fixed) {
                         throw new VetoCamelContextStartException("CamelContext (" + context.getName() + ") with ObjectName[" + on + "] is already registered."
                             + " Make sure to use unique names on CamelContext when using multiple CamelContexts in the same MBeanServer.", context);
                     } else {
-                        if (context.getNameStrategy() instanceof DefaultCamelContextNameStrategy) {
-                            // use this as the fixed name
-                            LOG.warn("Reassigned auto assigned name on CamelContext from: " + context.getName()
-                                    + " to: " + name + " due to clash with existing name already registered in MBeanServer.");
-                            // now set the fixed name we are using onwards
-                            context.setNameStrategy(new ExplicitCamelContextNameStrategy(name));
-                        } else {
-                            LOG.warn("This CamelContext(" + context.getName() + ") will be registered using the name: " + managementName
-                                + " due to clash with an existing name already registered in MBeanServer.");
-                        }
+                        LOG.warn("This CamelContext(" + context.getName() + ") will be registered using the name: " + managementName
+                            + " due to clash with an existing name already registered in MBeanServer.");
                     }
                 }
             }
@@ -169,7 +161,9 @@ public class DefaultManagementLifecycleS
         }
 
         // set the name we are going to use
-        context.setManagementName(managementName);
+        if (context instanceof DefaultCamelContext) {
+            ((DefaultCamelContext) context).setManagementName(managementName);
+        }
 
         try {
             manageObject(mc);
@@ -186,27 +180,25 @@ public class DefaultManagementLifecycleS
         enlistPreRegisteredServices();
     }
 
-    private String findFreeName(Object mc, CamelContextNameStrategy strategy, String managementName) throws MalformedObjectNameException {
+    private String findFreeName(Object mc, ManagementNameStrategy strategy, String name) throws MalformedObjectNameException {
+        // we cannot find a free name for fixed named strategies
+        if (strategy.isFixedName()) {
+            return null;
+        }
+
+        // okay try to find a free name
         boolean done = false;
-        String name = null;
-        // start from 2 as the existing name is considered the 1st
-        int counter = 2;
+        String newName = null;
         while (!done) {
             // compute the next name
-            if (strategy instanceof DefaultCamelContextNameStrategy) {
-                // prefer to use the default naming strategy to compute the next free name
-                name = ((DefaultCamelContextNameStrategy) strategy).getNextName();
-            } else {
-                // if explicit name then use a counter prefix
-                name = managementName + "-" + counter++;
-            }
-            ObjectName on = getManagementStrategy().getManagementNamingStrategy().getObjectNameForCamelContext(name);
+            newName = strategy.getNextName();
+            ObjectName on = getManagementStrategy().getManagementNamingStrategy().getObjectNameForCamelContext(newName, name);
             done = !getManagementStrategy().isManaged(mc, on);
             if (LOG.isTraceEnabled()) {
                 LOG.trace("Using name: {} in ObjectName[{}] exists? {}", new Object[]{name, on, done});
             }
         }
-        return name;
+        return newName;
     }
 
     /**

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultManagementNamingStrategy.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultManagementNamingStrategy.java?rev=1232367&r1=1232366&r2=1232367&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultManagementNamingStrategy.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultManagementNamingStrategy.java Tue Jan 17 09:47:25 2012
@@ -78,22 +78,23 @@ public class DefaultManagementNamingStra
         }
     }
 
-    public ObjectName getObjectNameForCamelContext(String name) throws MalformedObjectNameException {
+    public ObjectName getObjectNameForCamelContext(String managementName, String name) throws MalformedObjectNameException {
         StringBuilder buffer = new StringBuilder();
         buffer.append(domainName).append(":");
-        buffer.append(KEY_CONTEXT + "=").append(getContextId(name)).append(",");
+        buffer.append(KEY_CONTEXT + "=").append(getContextId(managementName)).append(",");
         buffer.append(KEY_TYPE + "=" + TYPE_CONTEXT + ",");
         buffer.append(KEY_NAME + "=").append(ObjectName.quote(name));
         return createObjectName(buffer);
     }
 
     public ObjectName getObjectNameForCamelContext(CamelContext context) throws MalformedObjectNameException {
-        StringBuilder buffer = new StringBuilder();
-        buffer.append(domainName).append(":");
-        buffer.append(KEY_CONTEXT + "=").append(getContextId(context)).append(",");
-        buffer.append(KEY_TYPE + "=" + TYPE_CONTEXT + ",");
-        buffer.append(KEY_NAME + "=").append(ObjectName.quote(context.getName()));
-        return createObjectName(buffer);
+        // prefer to use the given management name if previously assigned
+        String managementName = context.getManagementName();
+        if (managementName == null) {
+            managementName = context.getManagementNameStrategy().getName();
+        }
+        String name = context.getName();
+        return getObjectNameForCamelContext(managementName, name);
     }
 
     public ObjectName getObjectNameForEndpoint(Endpoint endpoint) throws MalformedObjectNameException {

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/spi/CamelContextNameStrategy.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/CamelContextNameStrategy.java?rev=1232367&r1=1232366&r2=1232367&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/spi/CamelContextNameStrategy.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/spi/CamelContextNameStrategy.java Tue Jan 17 09:47:25 2012
@@ -19,9 +19,34 @@ package org.apache.camel.spi;
 /**
  * Strategy for assigning name to a {@link org.apache.camel.CamelContext}.
  *
- * @version 
+ * @see ManagementNameStrategy
  */
 public interface CamelContextNameStrategy {
 
+    /**
+     * Gets the name
+     * <p/>
+     * The {@link #isFixedName()} determines if the name can be re-calculated such as when using a counter,
+     * or the name is always fixed.
+     *
+     * @return the name.
+     */
     String getName();
+
+    /**
+     * Gets the next calculated name, if this strategy is not using fixed names.
+     * <p/>
+     * The {@link #isFixedName()} determines if the name can be re-calculated such as when using a counter,
+     * or the name is always fixed.
+     *
+     * @return the next name
+     */
+    String getNextName();
+
+    /**
+     * Whether the name will be fixed, or allow re-calculation such as by using an unique counter.
+     * 
+     * @return <tt>true</tt> for fixed names, <tt>false</tt> for names which can re-calculated
+     */
+    boolean isFixedName();
 }

Copied: camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ManagementNameStrategy.java (from r1232308, camel/trunk/camel-core/src/main/java/org/apache/camel/spi/CamelContextNameStrategy.java)
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ManagementNameStrategy.java?p2=camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ManagementNameStrategy.java&p1=camel/trunk/camel-core/src/main/java/org/apache/camel/spi/CamelContextNameStrategy.java&r1=1232308&r2=1232367&rev=1232367&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/spi/CamelContextNameStrategy.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ManagementNameStrategy.java Tue Jan 17 09:47:25 2012
@@ -17,11 +17,64 @@
 package org.apache.camel.spi;
 
 /**
- * Strategy for assigning name to a {@link org.apache.camel.CamelContext}.
+ * Strategy for assigning the name part of the {@link javax.management.ObjectName}
+ * for a managed {@link org.apache.camel.CamelContext}.
+ * <p/>
+ * A strategy is needed as you can run multiple CamelContext in the same JVM, and want them
+ * to be enlisted in the JVM wide JMXMBeanServer. And this requires a strategy to be able
+ * to calculate unique names, in case of clashes. Or to enforce an explicit fixed name,
+ * to ensure the JMX name is not using dynamic counters etc.
+ * <p/>
+ * This strategy supports a naming pattern which supports at least the following tokens
+ * <ul>
+ *   <li>#camelId# - the camel id (eg the camel name)</li>
+ *   <li>#name# - same as #camelId#</li>
+ *   <li>#counter# - an incrementing counter</li>
+ * </ul>
  *
- * @version 
+ * @see CamelContextNameStrategy
+ * @see org.apache.camel.impl.DefaultManagementNameStrategy
  */
-public interface CamelContextNameStrategy {
+public interface ManagementNameStrategy {
 
+    /**
+     * Gets the custom name pattern.
+     *
+     * @return the custom name pattern, or <tt>null</tt> if using the default pattern strategy.
+     */
+    String getNamePattern();
+
+    /**
+     * Sets a custom name pattern, which will be used instead of any default patterns.
+     *
+     * @param pattern a custom name pattern.
+     */
+    void setNamePattern(String pattern);
+
+    /**
+     * Gets the name
+     * <p/>
+     * The {@link #isFixedName()} determines if the name can be re-calculated such as when using a counter,
+     * or the name is always fixed.
+     *
+     * @return the name.
+     */
     String getName();
+
+    /**
+     * Gets the next calculated name, if this strategy is not using fixed names.
+     * <p/>
+     * The {@link #isFixedName()} determines if the name can be re-calculated such as when using a counter,
+     * or the name is always fixed.
+     *
+     * @return the next name
+     */
+    String getNextName();
+
+    /**
+     * Whether the name will be fixed, or allow re-calculation such as by using an unique counter.
+     *
+     * @return <tt>true</tt> for fixed names, <tt>false</tt> for names which can re-calculated
+     */
+    boolean isFixedName();
 }

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ManagementNamingStrategy.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ManagementNamingStrategy.java?rev=1232367&r1=1232366&r2=1232367&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ManagementNamingStrategy.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ManagementNamingStrategy.java Tue Jan 17 09:47:25 2012
@@ -38,7 +38,7 @@ import org.apache.camel.model.ProcessorD
  */
 public interface ManagementNamingStrategy {
 
-    ObjectName getObjectNameForCamelContext(String name) throws MalformedObjectNameException;
+    ObjectName getObjectNameForCamelContext(String managementName, String name) throws MalformedObjectNameException;
 
     ObjectName getObjectNameForCamelContext(CamelContext context) throws MalformedObjectNameException;
 

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/management/ManagedNamePatternFixedTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/management/ManagedNamePatternFixedTest.java?rev=1232367&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/management/ManagedNamePatternFixedTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/management/ManagedNamePatternFixedTest.java Tue Jan 17 09:47:25 2012
@@ -0,0 +1,55 @@
+/**
+ * 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;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.builder.RouteBuilder;
+
+/**
+ * @version 
+ */
+public class ManagedNamePatternFixedTest extends ManagementTestSupport {
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = super.createCamelContext();
+        context.getManagementNameStrategy().setNamePattern("cool");
+        return context;
+    }
+
+    public void testManagedNamePattern() throws Exception {
+        MBeanServer mbeanServer = getMBeanServer();
+
+        assertEquals("cool", context.getManagementName());
+
+        ObjectName on = ObjectName.getInstance("org.apache.camel:context=localhost/" + context.getManagementName() + ",type=context,name=\"camel-1\"");
+        assertTrue("Should be registered", mbeanServer.isRegistered(on));
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start").to("mock:result");
+            }
+        };
+    }
+}

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/management/ManagedNamePatternTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/management/ManagedNamePatternTest.java?rev=1232367&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/management/ManagedNamePatternTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/management/ManagedNamePatternTest.java Tue Jan 17 09:47:25 2012
@@ -0,0 +1,55 @@
+/**
+ * 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;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.builder.RouteBuilder;
+
+/**
+ * @version 
+ */
+public class ManagedNamePatternTest extends ManagementTestSupport {
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = super.createCamelContext();
+        context.getManagementNameStrategy().setNamePattern("cool-#name#");
+        return context;
+    }
+
+    public void testManagedNamePattern() throws Exception {
+        MBeanServer mbeanServer = getMBeanServer();
+
+        assertTrue(context.getManagementName().startsWith("cool"));
+
+        ObjectName on = ObjectName.getInstance("org.apache.camel:context=localhost/" + context.getManagementName() + ",type=context,name=\"camel-1\"");
+        assertTrue("Should be registered", mbeanServer.isRegistered(on));
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start").to("mock:result");
+            }
+        };
+    }
+}

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/management/TwoManagedCamelContextAutoAssignedNameClashTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/management/TwoManagedCamelContextAutoAssignedNameClashTest.java?rev=1232367&r1=1232366&r2=1232367&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/management/TwoManagedCamelContextAutoAssignedNameClashTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/management/TwoManagedCamelContextAutoAssignedNameClashTest.java Tue Jan 17 09:47:25 2012
@@ -46,7 +46,7 @@ public class TwoManagedCamelContextAutoA
         assertTrue("Should be started", camel1.getStatus().isStarted());
 
         MBeanServer mbeanServer = camel1.getManagementStrategy().getManagementAgent().getMBeanServer();
-        ObjectName on = ObjectName.getInstance("org.apache.camel:context=localhost/camel-1,type=context,name=\"camel-1\"");
+        ObjectName on = ObjectName.getInstance("org.apache.camel:context=localhost/" + camel1.getManagementName() + ",type=context,name=\"camel-1\"");
         assertTrue("Should be registered", mbeanServer.isRegistered(on));
 
         // now cheat and reset the counter so we can test for a clash
@@ -54,7 +54,7 @@ public class TwoManagedCamelContextAutoA
 
         camel2 = createCamelContext();
         camel2.start();
-        ObjectName on2 = ObjectName.getInstance("org.apache.camel:context=localhost/camel-2,type=context,name=\"camel-2\"");
+        ObjectName on2 = ObjectName.getInstance("org.apache.camel:context=localhost/" + camel2.getManagementName() + ",type=context,name=\"camel-1\"");
         assertTrue("Should be registered", mbeanServer.isRegistered(on2));
 
         assertTrue("Should still be registered after name clash", mbeanServer.isRegistered(on));

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/management/TwoManagedCamelContextClashTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/management/TwoManagedCamelContextClashTest.java?rev=1232367&r1=1232366&r2=1232367&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/management/TwoManagedCamelContextClashTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/management/TwoManagedCamelContextClashTest.java Tue Jan 17 09:47:25 2012
@@ -21,6 +21,7 @@ import javax.management.ObjectName;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.TestSupport;
+import org.apache.camel.VetoCamelContextStartException;
 import org.apache.camel.impl.DefaultCamelContext;
 
 /**
@@ -31,35 +32,78 @@ public class TwoManagedCamelContextClash
     private CamelContext camel1;
     private CamelContext camel2;
 
-    protected CamelContext createCamelContext(String name) throws Exception {
+    protected CamelContext createCamelContext(String name, String managementPattern) throws Exception {
         DefaultCamelContext context = new DefaultCamelContext();
         context.setName(name);
+        if (managementPattern != null) {
+            context.getManagementNameStrategy().setNamePattern(managementPattern);
+        }
         DefaultManagementNamingStrategy naming = (DefaultManagementNamingStrategy) context.getManagementStrategy().getManagementNamingStrategy();
         naming.setHostName("localhost");
         naming.setDomainName("org.apache.camel");
         return context;
     }
 
-    public void testTwoManagedCamelContextClash() throws Exception {
-        camel1 = createCamelContext("foo");
-        camel2 = createCamelContext("foo");
+    public void testTwoManagedCamelContextNoClashDefault() throws Exception {
+        camel1 = createCamelContext("foo", null);
+        camel2 = createCamelContext("foo", null);
 
         camel1.start();
         assertTrue("Should be started", camel1.getStatus().isStarted());
 
         MBeanServer mbeanServer = camel1.getManagementStrategy().getManagementAgent().getMBeanServer();
-        ObjectName on = ObjectName.getInstance("org.apache.camel:context=localhost/foo,type=context,name=\"foo\"");
+        ObjectName on = ObjectName.getInstance("org.apache.camel:context=localhost/" + camel1.getManagementName() + ",type=context,name=\"foo\"");
         assertTrue("Should be registered", mbeanServer.isRegistered(on));
 
-        // camel will now automatic re assign the JMX name to avoid the clash
+        // the default name pattern will ensure the JMX names is unique
         camel2.start();
-        ObjectName on2 = ObjectName.getInstance("org.apache.camel:context=localhost/foo-2,type=context,name=\"foo\"");
+        ObjectName on2 = ObjectName.getInstance("org.apache.camel:context=localhost/" + camel2.getManagementName() + ",type=context,name=\"foo\"");
         assertTrue("Should be registered", mbeanServer.isRegistered(on2));
 
         assertTrue("Should still be registered after name clash", mbeanServer.isRegistered(on));
         assertTrue("Should still be registered after name clash", mbeanServer.isRegistered(on2));
     }
 
+    public void testTwoManagedCamelContextNoClashCustomPattern() throws Exception {
+        camel1 = createCamelContext("foo", "killer-#counter#");
+        camel2 = createCamelContext("foo", "killer-#counter#");
+
+        camel1.start();
+        assertTrue("Should be started", camel1.getStatus().isStarted());
+
+        MBeanServer mbeanServer = camel1.getManagementStrategy().getManagementAgent().getMBeanServer();
+        ObjectName on = ObjectName.getInstance("org.apache.camel:context=localhost/" + camel1.getManagementName() + ",type=context,name=\"foo\"");
+        assertTrue("Should be registered", mbeanServer.isRegistered(on));
+
+        // the pattern has a counter so no clash
+        camel2.start();
+        ObjectName on2 = ObjectName.getInstance("org.apache.camel:context=localhost/" + camel2.getManagementName() + ",type=context,name=\"foo\"");
+        assertTrue("Should be registered", mbeanServer.isRegistered(on2));
+
+        assertTrue("Should still be registered after name clash", mbeanServer.isRegistered(on));
+        assertTrue("Should still be registered after name clash", mbeanServer.isRegistered(on2));
+    }
+
+    public void testTwoManagedCamelContextClash() throws Exception {
+        camel1 = createCamelContext("foo", "myFoo");
+        camel2 = createCamelContext("foo", "myFoo");
+
+        camel1.start();
+        assertTrue("Should be started", camel1.getStatus().isStarted());
+
+        MBeanServer mbeanServer = camel1.getManagementStrategy().getManagementAgent().getMBeanServer();
+        ObjectName on = ObjectName.getInstance("org.apache.camel:context=localhost/" + camel1.getManagementName() + ",type=context,name=\"foo\"");
+        assertTrue("Should be registered", mbeanServer.isRegistered(on));
+
+        // we use fixed names, so we will get a clash
+        try {
+            camel2.start();
+            fail("Should have thrown an exception");
+        } catch (VetoCamelContextStartException e) {
+            assertTrue(e.getMessage().contains("is already registered"));
+        }
+    }
+
     @Override
     protected void tearDown() throws Exception {
         camel1.stop();

Copied: camel/trunk/camel-core/src/test/java/org/apache/camel/management/TwoManagedNamePatternTest.java (from r1232308, camel/trunk/camel-core/src/test/java/org/apache/camel/management/TwoManagedCamelContextTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/management/TwoManagedNamePatternTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/management/TwoManagedNamePatternTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/management/TwoManagedCamelContextTest.java&r1=1232308&r2=1232367&rev=1232367&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/management/TwoManagedCamelContextTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/management/TwoManagedNamePatternTest.java Tue Jan 17 09:47:25 2012
@@ -26,33 +26,34 @@ import org.apache.camel.impl.DefaultCame
 /**
  * @version 
  */
-public class TwoManagedCamelContextTest extends TestSupport {
+public class TwoManagedNamePatternTest extends TestSupport {
 
     private CamelContext camel1;
     private CamelContext camel2;
 
-    protected CamelContext createCamelContext(String name) throws Exception {
+    protected CamelContext createCamelContext(String name, String pattern) throws Exception {
         DefaultCamelContext context = new DefaultCamelContext();
         context.setName(name);
+        context.getManagementNameStrategy().setNamePattern(pattern);
         DefaultManagementNamingStrategy naming = (DefaultManagementNamingStrategy) context.getManagementStrategy().getManagementNamingStrategy();
         naming.setHostName("localhost");
         naming.setDomainName("org.apache.camel");
         return context;
     }
 
-    public void testTwoManagedCamelContext() throws Exception {
-        camel1 = createCamelContext("foo");
-        camel2 = createCamelContext("bar");
+    public void testManagedNamePattern() throws Exception {
+        camel1 = createCamelContext("foo", "aaa-#name#");
+        camel2 = createCamelContext("bar", "bbb-#name#");
 
         camel1.start();
         camel2.start();
 
         MBeanServer mbeanServer = camel1.getManagementStrategy().getManagementAgent().getMBeanServer();
 
-        ObjectName on = ObjectName.getInstance("org.apache.camel:context=localhost/foo,type=context,name=\"foo\"");
+        ObjectName on = ObjectName.getInstance("org.apache.camel:context=localhost/aaa-foo,type=context,name=\"foo\"");
         assertTrue("Should be registered", mbeanServer.isRegistered(on));
 
-        ObjectName on2 = ObjectName.getInstance("org.apache.camel:context=localhost/bar,type=context,name=\"bar\"");
+        ObjectName on2 = ObjectName.getInstance("org.apache.camel:context=localhost/bbb-bar,type=context,name=\"bar\"");
         assertTrue("Should be registered", mbeanServer.isRegistered(on2));
 
         camel1.stop();

Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/management/TwoManagedNamePatternTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java?rev=1232367&r1=1232366&r2=1232367&view=diff
==============================================================================
--- camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java (original)
+++ camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java Tue Jan 17 09:47:25 2012
@@ -21,6 +21,7 @@ import org.apache.camel.core.osgi.OsgiCa
 import org.apache.camel.core.osgi.OsgiCamelContextNameStrategy;
 import org.apache.camel.core.osgi.OsgiClassResolver;
 import org.apache.camel.core.osgi.OsgiFactoryFinderResolver;
+import org.apache.camel.core.osgi.OsgiManagementNameStrategy;
 import org.apache.camel.core.osgi.OsgiPackageScanClassResolver;
 import org.apache.camel.core.osgi.OsgiTypeConverter;
 import org.apache.camel.core.osgi.utils.BundleContextUtils;

Modified: camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java?rev=1232367&r1=1232366&r2=1232367&view=diff
==============================================================================
--- camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java (original)
+++ camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java Tue Jan 17 09:47:25 2012
@@ -92,6 +92,8 @@ public class CamelContextFactoryBean ext
     @XmlAttribute(required = false)
     private String useBreadcrumb;
     @XmlAttribute(required = false)
+    private String managementNamePattern;
+    @XmlAttribute(required = false)
     private Boolean useBlueprintPropertyResolver;
     @XmlAttribute(required = false)
     private ShutdownRoute shutdownRoute;
@@ -307,6 +309,14 @@ public class CamelContextFactoryBean ext
         this.useBreadcrumb = useBreadcrumb;
     }
 
+    public String getManagementNamePattern() {
+        return managementNamePattern;
+    }
+
+    public void setManagementNamePattern(String managementNamePattern) {
+        this.managementNamePattern = managementNamePattern;
+    }
+
     public Boolean getLazyLoadTypeConverters() {
         return lazyLoadTypeConverters;
     }

Modified: camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextHelper.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextHelper.java?rev=1232367&r1=1232366&r2=1232367&view=diff
==============================================================================
--- camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextHelper.java (original)
+++ camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextHelper.java Tue Jan 17 09:47:25 2012
@@ -37,6 +37,8 @@ public final class OsgiCamelContextHelpe
 
         LOG.debug("Using OsgiCamelContextNameStrategy");
         camelContext.setNameStrategy(new OsgiCamelContextNameStrategy(bundleContext));
+        LOG.debug("Using OsgiManagementNameStrategy");
+        camelContext.setManagementNameStrategy(new OsgiManagementNameStrategy(camelContext, bundleContext));
         LOG.debug("Using OsgiClassResolver");
         camelContext.setClassResolver(new OsgiClassResolver(bundleContext));
         LOG.debug("Using OsgiFactoryFinderResolver");

Modified: camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiDefaultCamelContext.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiDefaultCamelContext.java?rev=1232367&r1=1232366&r2=1232367&view=diff
==============================================================================
--- camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiDefaultCamelContext.java (original)
+++ camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiDefaultCamelContext.java Tue Jan 17 09:47:25 2012
@@ -58,10 +58,4 @@ public class OsgiDefaultCamelContext ext
         return new OsgiTypeConverter(ctx, getInjector(), finder);
     }
 
-    @Override
-    public void setName(String name) {
-        super.setName(name);
-        // in OSGi append the bundle id to the management name so it will be unique in the JVM
-        super.setManagementName(name + "-" + bundleContext.getBundle().getBundleId());
-    }
 }

Added: camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiManagementNameStrategy.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiManagementNameStrategy.java?rev=1232367&view=auto
==============================================================================
--- camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiManagementNameStrategy.java (added)
+++ camel/trunk/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiManagementNameStrategy.java Tue Jan 17 09:47:25 2012
@@ -0,0 +1,59 @@
+/**
+ * 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.core.osgi;
+
+import java.util.regex.Matcher;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.impl.DefaultManagementNameStrategy;
+import org.osgi.framework.BundleContext;
+
+/**
+ * OSGI enhanced {@link org.apache.camel.spi.ManagementNameStrategy}.
+ * <p/>
+ * This {@link org.apache.camel.spi.ManagementNameStrategy} supports the default
+ * tokens (see {@link DefaultManagementNameStrategy}) and the following additional OSGi specific tokens
+ * <ul>
+ *     <li>#bundleId# - The bundle id</li>
+ *     <li>#symbolicName# - The bundle symbolic name</li>
+ * </ul>
+ * <p/>
+ * This implementation will by default use a name pattern as <tt>#bundleId#-#name#</tt> and in case
+ * of a clash, then the pattern will fallback to be using the counter as <tt>#bundleId#-#name#-#counter#</tt>.
+ *
+ * @see DefaultManagementNameStrategy
+ */
+public class OsgiManagementNameStrategy extends DefaultManagementNameStrategy {
+
+    private final BundleContext bundleContext;
+
+    public OsgiManagementNameStrategy(CamelContext camelContext, BundleContext bundleContext) {
+        super(camelContext, "#bundleId#-#name#", "#bundleId#-#name#-#counter#");
+        this.bundleContext = bundleContext;
+    }
+
+    @Override
+    protected String customResolveManagementName(String pattern, String answer) {
+        String bundleId = "" + bundleContext.getBundle().getBundleId();
+        String symbolicName = Matcher.quoteReplacement(bundleContext.getBundle().getSymbolicName());
+
+        answer = answer.replaceFirst("#bundleId#", bundleId);
+        answer = answer.replaceFirst("#symbolicName#", symbolicName);
+        return answer;
+    }
+    
+}

Modified: camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java?rev=1232367&r1=1232366&r2=1232367&view=diff
==============================================================================
--- camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java (original)
+++ camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java Tue Jan 17 09:47:25 2012
@@ -497,6 +497,8 @@ public abstract class AbstractCamelConte
 
     public abstract String getUseBreadcrumb();
 
+    public abstract String getManagementNamePattern();
+
     public abstract Boolean getLazyLoadTypeConverters();
 
     public abstract CamelJMXAgentDefinition getCamelJMXAgent();
@@ -555,6 +557,9 @@ public abstract class AbstractCamelConte
         if (getUseBreadcrumb() != null) {
             ctx.setUseBreadcrumb(CamelContextHelper.parseBoolean(getContext(), getUseBreadcrumb()));
         }
+        if (getManagementNamePattern() != null) {
+            ctx.getManagementNameStrategy().setNamePattern(getManagementNamePattern());
+        }
         if (getShutdownRoute() != null) {
             ctx.setShutdownRoute(getShutdownRoute());
         }

Modified: camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java?rev=1232367&r1=1232366&r2=1232367&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java (original)
+++ camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java Tue Jan 17 09:47:25 2012
@@ -99,6 +99,8 @@ public class CamelContextFactoryBean ext
     @XmlAttribute(required = false)
     private String useBreadcrumb;
     @XmlAttribute(required = false)
+    private String managementNamePattern;
+    @XmlAttribute(required = false)
     private ShutdownRoute shutdownRoute;
     @XmlAttribute(required = false)
     private ShutdownRunningTask shutdownRunningTask;
@@ -468,6 +470,14 @@ public class CamelContextFactoryBean ext
         this.useBreadcrumb = useBreadcrumb;
     }
 
+    public String getManagementNamePattern() {
+        return managementNamePattern;
+    }
+
+    public void setManagementNamePattern(String managementNamePattern) {
+        this.managementNamePattern = managementNamePattern;
+    }
+
     public Boolean getLazyLoadTypeConverters() {
         return lazyLoadTypeConverters;
     }

Added: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/management/SpringManagedNamePatternFixedTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/management/SpringManagedNamePatternFixedTest.java?rev=1232367&view=auto
==============================================================================
--- camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/management/SpringManagedNamePatternFixedTest.java (added)
+++ camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/management/SpringManagedNamePatternFixedTest.java Tue Jan 17 09:47:25 2012
@@ -0,0 +1,33 @@
+/**
+ * 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.management;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.management.ManagedNamePatternFixedTest;
+
+import static org.apache.camel.spring.processor.SpringTestHelper.createSpringCamelContext;
+
+/**
+ * @version 
+ */
+public class SpringManagedNamePatternFixedTest extends ManagedNamePatternFixedTest {
+
+    protected CamelContext createCamelContext() throws Exception {
+        return createSpringCamelContext(this, "org/apache/camel/spring/management/SpringManagedNamePatternFixedTest.xml");
+    }
+
+}

Copied: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/management/SpringManagedNamePatternTest.java (from r1232308, camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/management/SpringManagedStatisticsLevelOffTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/management/SpringManagedNamePatternTest.java?p2=camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/management/SpringManagedNamePatternTest.java&p1=camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/management/SpringManagedStatisticsLevelOffTest.java&r1=1232308&r2=1232367&rev=1232367&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/management/SpringManagedStatisticsLevelOffTest.java (original)
+++ camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/management/SpringManagedNamePatternTest.java Tue Jan 17 09:47:25 2012
@@ -17,16 +17,17 @@
 package org.apache.camel.spring.management;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.management.ManagedStatisticsLevelOffTest;
+import org.apache.camel.management.ManagedNamePatternTest;
+
 import static org.apache.camel.spring.processor.SpringTestHelper.createSpringCamelContext;
 
 /**
  * @version 
  */
-public class SpringManagedStatisticsLevelOffTest extends ManagedStatisticsLevelOffTest {
+public class SpringManagedNamePatternTest extends ManagedNamePatternTest {
 
     protected CamelContext createCamelContext() throws Exception {
-        return createSpringCamelContext(this, "org/apache/camel/spring/management/SpringManagedStatisticsLevelOffTest.xml");
+        return createSpringCamelContext(this, "org/apache/camel/spring/management/SpringManagedNamePatternTest.xml");
     }
 
 }

Added: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/SpringManagedNamePatternFixedTest.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/SpringManagedNamePatternFixedTest.xml?rev=1232367&view=auto
==============================================================================
--- camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/SpringManagedNamePatternFixedTest.xml (added)
+++ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/SpringManagedNamePatternFixedTest.xml Tue Jan 17 09:47:25 2012
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    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.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
+    ">
+
+  <bean id="naming" class="org.apache.camel.management.DefaultManagementNamingStrategy">
+    <property name="hostName" value="localhost"/>
+    <property name="domainName" value="org.apache.camel"/>
+  </bean>
+
+  <!-- START SNIPPET: example -->
+  <camelContext managementNamePattern="cool" xmlns="http://camel.apache.org/schema/spring">
+    <jmxAgent id="agent"/>
+
+    <route>
+      <from uri="direct:start"/>
+      <to uri="mock:result"/>
+    </route>
+  </camelContext>
+  <!-- END SNIPPET: example -->
+
+</beans>

Copied: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/SpringManagedNamePatternTest.xml (from r1232308, camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/SpringManagedStatisticsLevelOffTest.xml)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/SpringManagedNamePatternTest.xml?p2=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/SpringManagedNamePatternTest.xml&p1=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/SpringManagedStatisticsLevelOffTest.xml&r1=1232308&r2=1232367&rev=1232367&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/SpringManagedStatisticsLevelOffTest.xml (original)
+++ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/management/SpringManagedNamePatternTest.xml Tue Jan 17 09:47:25 2012
@@ -22,15 +22,20 @@
        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
     ">
 
-    <!-- START SNIPPET: example -->
-    <camelContext xmlns="http://camel.apache.org/schema/spring">
-        <jmxAgent id="agent" statisticsLevel="Off"/>
+  <bean id="naming" class="org.apache.camel.management.DefaultManagementNamingStrategy">
+    <property name="hostName" value="localhost"/>
+    <property name="domainName" value="org.apache.camel"/>
+  </bean>
 
-        <route>
-            <from uri="direct:start"/>
-            <to uri="mock:result"/>
-        </route>
-    </camelContext>
-    <!-- END SNIPPET: example -->
+  <!-- START SNIPPET: example -->
+  <camelContext managementNamePattern="cool-#name#" xmlns="http://camel.apache.org/schema/spring">
+    <jmxAgent id="agent"/>
+
+    <route>
+      <from uri="direct:start"/>
+      <to uri="mock:result"/>
+    </route>
+  </camelContext>
+  <!-- END SNIPPET: example -->
 
 </beans>

Copied: camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/blueprint/CamelBlueprintManagedNamePatternFixedTest.java (from r1232332, camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/blueprint/CamelBlueprint5Test.java)
URL: http://svn.apache.org/viewvc/camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/blueprint/CamelBlueprintManagedNamePatternFixedTest.java?p2=camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/blueprint/CamelBlueprintManagedNamePatternFixedTest.java&p1=camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/blueprint/CamelBlueprint5Test.java&r1=1232332&r2=1232367&rev=1232367&view=diff
==============================================================================
--- camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/blueprint/CamelBlueprint5Test.java (original)
+++ camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/blueprint/CamelBlueprintManagedNamePatternFixedTest.java Tue Jan 17 09:47:25 2012
@@ -16,6 +16,9 @@
  */
 package org.apache.camel.itest.osgi.blueprint;
 
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
 import org.apache.camel.CamelContext;
 import org.apache.camel.ProducerTemplate;
 import org.apache.camel.component.mock.MockEndpoint;
@@ -35,28 +38,27 @@ import static org.ops4j.pax.swissbox.tin
  * @version 
  */
 @RunWith(JUnit4TestRunner.class)
-public class CamelBlueprint5Test extends OSGiBlueprintTestSupport {
+public class CamelBlueprintManagedNamePatternFixedTest extends OSGiBlueprintTestSupport {
 
     @Test
-    public void testTryCatch() throws Exception {
-        getInstalledBundle("CamelBlueprintTestBundle23").start();
-        BlueprintContainer ctn = getOsgiService(BlueprintContainer.class, "(osgi.blueprint.container.symbolicname=CamelBlueprintTestBundle23)", 10000);
-        CamelContext ctx = getOsgiService(CamelContext.class, "(camel.context.symbolicname=CamelBlueprintTestBundle23)", 10000);
+    public void testManagedNamePatternFixed() throws Exception {
+        getInstalledBundle("CamelBlueprintTestBundleFixed").start();
+        BlueprintContainer ctn = getOsgiService(BlueprintContainer.class, "(osgi.blueprint.container.symbolicname=CamelBlueprintTestBundleFixed)", 10000);
+        CamelContext ctx = getOsgiService(CamelContext.class, "(camel.context.symbolicname=CamelBlueprintTestBundleFixed)", 10000);
 
         ProducerTemplate template = ctx.createProducerTemplate();
 
         MockEndpoint mock = ctx.getEndpoint("mock:result", MockEndpoint.class);
-        mock.expectedMessageCount(1);
+        template.sendBody("direct:start", "World");
+        mock.assertIsSatisfied();
 
-        MockEndpoint error = ctx.getEndpoint("mock:error", MockEndpoint.class);
-        error.expectedMessageCount(1);
+        MBeanServer mbeanServer = ctx.getManagementStrategy().getManagementAgent().getMBeanServer();
 
-        template.sendBody("direct:start", "Hello World");
-        template.sendBody("direct:start", "Kaboom");
+        assertEquals("cool", ctx.getManagementName());
 
-        mock.assertIsSatisfied();
-        error.assertIsSatisfied();
-        template.stop();
+        ObjectName on = ObjectName.getInstance("org.apache.camel:context=localhost/" + ctx.getManagementName()
+                + ",type=context,name=\"" + ctx.getName() + "\"");
+        assertTrue("Should be registered", mbeanServer.isRegistered(on));
     }
 
     @Configuration
@@ -66,9 +68,9 @@ public class CamelBlueprint5Test extends
                 getDefaultCamelKarafOptions(),
 
                 bundle(newBundle()
-                        .add("OSGI-INF/blueprint/test.xml", OSGiBlueprintTestSupport.class.getResource("blueprint-23.xml"))
-                        .set(Constants.BUNDLE_SYMBOLICNAME, "CamelBlueprintTestBundle23")
-                        .add(MyException.class)
+                        .add("OSGI-INF/blueprint/test.xml", OSGiBlueprintTestSupport.class.getResource("blueprint-fixed.xml"))
+                        .set(Constants.BUNDLE_SYMBOLICNAME, "CamelBlueprintTestBundleFixed")
+                        .set(Constants.DYNAMICIMPORT_PACKAGE, "*")
                         .build()).noStart(),
 
                 // using the features to install the camel components

Copied: camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/blueprint/blueprint-fixed.xml (from r1232332, camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/blueprint/blueprint-23.xml)
URL: http://svn.apache.org/viewvc/camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/blueprint/blueprint-fixed.xml?p2=camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/blueprint/blueprint-fixed.xml&p1=camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/blueprint/blueprint-23.xml&r1=1232332&r2=1232367&rev=1232367&view=diff
==============================================================================
--- camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/blueprint/blueprint-23.xml (original)
+++ camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/blueprint/blueprint-fixed.xml Tue Jan 17 09:47:25 2012
@@ -17,26 +17,18 @@
 -->
 <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
 
-  <bean id="damn" class="org.apache.camel.itest.osgi.blueprint.MyException"/>
+  <bean id="naming" class="org.apache.camel.management.DefaultManagementNamingStrategy">
+    <property name="hostName" value="localhost"/>
+    <property name="domainName" value="org.apache.camel"/>
+  </bean>
+
+  <!-- START SNIPPET: example -->
+  <camelContext managementNamePattern="cool" xmlns="http://camel.apache.org/schema/blueprint">
+    <jmxAgent id="agent"/>
 
-  <camelContext xmlns="http://camel.apache.org/schema/blueprint">
     <route>
       <from uri="direct:start"/>
-      <doTry>
-        <choice>
-          <when>
-            <simple>${body} == 'Kaboom'</simple>
-            <throwException ref="damn"/>
-          </when>
-          <otherwise>
-            <to uri="mock:result"/>
-          </otherwise>
-        </choice>
-        <doCatch>
-          <exception>org.apache.camel.itest.osgi.blueprint.MyException</exception>
-          <to uri="mock:error"/>
-        </doCatch>
-      </doTry>
+      <to uri="mock:result"/>
     </route>
   </camelContext>