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>