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 2013/04/04 11:12:36 UTC
svn commit: r1464379 - in /camel/trunk:
camel-core/src/main/java/org/apache/camel/api/management/mbean/
camel-core/src/main/java/org/apache/camel/management/
camel-core/src/main/java/org/apache/camel/management/mbean/
camel-core/src/main/java/org/apach...
Author: davsclaus
Date: Thu Apr 4 09:12:35 2013
New Revision: 1464379
URL: http://svn.apache.org/r1464379
Log:
CAMEL-6239: Added index to processor defs so we know the order they were created / positioned in routes etc. Exposes that for JMX so karaf camel command can leverage that.
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedProcessorMBean.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/mbean/ManagedPerformanceCounter.java
camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedProcessor.java
camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java
camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java
camel/trunk/camel-core/src/main/java/org/apache/camel/util/ProcessorStatDump.java
camel/trunk/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/RouteProfile.java
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedProcessorMBean.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedProcessorMBean.java?rev=1464379&r1=1464378&r2=1464379&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedProcessorMBean.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedProcessorMBean.java Thu Apr 4 09:12:35 2013
@@ -33,6 +33,9 @@ public interface ManagedProcessorMBean e
@ManagedAttribute(description = "Processor ID")
String getProcessorId();
+ @ManagedAttribute(description = "Processor Index")
+ Integer getIndex();
+
@ManagedOperation(description = "Start Processor")
void start() throws Exception;
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=1464379&r1=1464378&r2=1464379&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 Thu Apr 4 09:12:35 2013
@@ -25,6 +25,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.atomic.AtomicLong;
import javax.management.JMException;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
@@ -100,6 +101,8 @@ import org.slf4j.LoggerFactory;
public class DefaultManagementLifecycleStrategy extends ServiceSupport implements LifecycleStrategy, CamelContextAware {
private static final Logger LOG = LoggerFactory.getLogger(DefaultManagementLifecycleStrategy.class);
+ // unique counter we use when registering a new mbean which allows to know the order they were registered
+ private final AtomicLong counter = new AtomicLong();
// the wrapped processors is for performance counters, which are in use for the created routes
// when a route is removed, we should remove the associated processors from this map
private final Map<Processor, KeyValueHolder<ProcessorDefinition<?>, InstrumentationProcessor>> wrappedProcessors =
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedPerformanceCounter.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedPerformanceCounter.java?rev=1464379&r1=1464378&r2=1464379&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedPerformanceCounter.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedPerformanceCounter.java Thu Apr 4 09:12:35 2013
@@ -26,7 +26,7 @@ import org.apache.camel.api.management.m
import org.apache.camel.spi.ManagementStrategy;
import org.apache.camel.util.ExchangeHelper;
-@ManagedResource(description = "PerformanceCounter")
+@ManagedResource(description = "Managed PerformanceCounter")
public abstract class ManagedPerformanceCounter extends ManagedCounter implements PerformanceCounter, ManagedPerformanceCounterMBean {
public static final String TIMESTAMP_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedProcessor.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedProcessor.java?rev=1464379&r1=1464378&r2=1464379&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedProcessor.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedProcessor.java Thu Apr 4 09:12:35 2013
@@ -62,6 +62,14 @@ public class ManagedProcessor extends Ma
return definition;
}
+ public String getId() {
+ return id;
+ }
+
+ public Integer getIndex() {
+ return definition.getIndex();
+ }
+
public Route getRoute() {
return route;
}
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java?rev=1464379&r1=1464378&r2=1464379&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java Thu Apr 4 09:12:35 2013
@@ -16,6 +16,9 @@
*/
package org.apache.camel.management.mbean;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@@ -228,13 +231,21 @@ public class ManagedRoute extends Manage
sb.append(" <processorStats>\n");
MBeanServer server = getContext().getManagementStrategy().getManagementAgent().getMBeanServer();
if (server != null) {
+ // get all the processor mbeans and sort them accordinly to their index
ObjectName query = ObjectName.getInstance("org.apache.camel:context=*/" + getContext().getManagementName() + ",type=processors,*");
Set<ObjectName> names = server.queryNames(query, null);
+ List<ManagedProcessorMBean> mps = new ArrayList<ManagedProcessorMBean>();
for (ObjectName on : names) {
ManagedProcessorMBean processor = MBeanServerInvocationHandler.newProxyInstance(server, on, ManagedProcessorMBean.class, true);
+ mps.add(processor);
+ }
+ Collections.sort(mps, new OrderProcessorMBeans());
+
+ // and now add the sorted list of processors to the xml output
+ for (ManagedProcessorMBean processor : mps) {
// the processor must belong to this route
if (getRouteId().equals(processor.getRouteId())) {
- sb.append(" <processorStat").append(String.format(" id=\"%s\"", processor.getProcessorId()));
+ sb.append(" <processorStat").append(String.format(" id=\"%s\" index=\"%s\"", processor.getProcessorId(), processor.getIndex()));
// use substring as we only want the attributes
sb.append(" ").append(processor.dumpStatsAsXml(fullStats).substring(7)).append("\n");
}
@@ -256,4 +267,16 @@ public class ManagedRoute extends Manage
public int hashCode() {
return route.hashCode();
}
+
+ /**
+ * Used for sorting the processor mbeans accordingly to their index.
+ */
+ private final static class OrderProcessorMBeans implements Comparator<ManagedProcessorMBean> {
+
+ @Override
+ public int compare(ManagedProcessorMBean o1, ManagedProcessorMBean o2) {
+ return o1.getIndex().compareTo(o2.getIndex());
+ }
+ }
+
}
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java?rev=1464379&r1=1464378&r2=1464379&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java Thu Apr 4 09:12:35 2013
@@ -27,6 +27,7 @@ import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAnyAttribute;
@@ -86,6 +87,25 @@ public abstract class ProcessorDefinitio
// use xs:any to support optional property placeholders
private Map<QName, Object> otherAttributes;
+ private static final AtomicInteger COUNTER = new AtomicInteger();
+ private final int index;
+
+ protected ProcessorDefinition() {
+ // every time we create a definition we should inc the COUNTER counter
+ index = COUNTER.getAndIncrement();
+ }
+
+ /**
+ * Gets the unique index number for when this {@link ProcessorDefinition} was created by its constructor.
+ * <p/>
+ * This can be used to know the order in which the definition was created when assembled as a route.
+ *
+ * @return the current COUNTER value
+ */
+ @XmlTransient // do not expose this in the XML DSL
+ public int getIndex() {
+ return index;
+ }
// else to use an optional attribute in JAXB2
public abstract List<ProcessorDefinition<?>> getOutputs();
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/util/ProcessorStatDump.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ProcessorStatDump.java?rev=1464379&r1=1464378&r2=1464379&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/util/ProcessorStatDump.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/util/ProcessorStatDump.java Thu Apr 4 09:12:35 2013
@@ -32,6 +32,9 @@ public final class ProcessorStatDump {
private String id;
@XmlAttribute
+ private Integer index;
+
+ @XmlAttribute
private Long exchangesCompleted;
@XmlAttribute
@@ -90,6 +93,14 @@ public final class ProcessorStatDump {
this.id = id;
}
+ public Integer getIndex() {
+ return index;
+ }
+
+ public void setIndex(Integer index) {
+ this.index = index;
+ }
+
public Long getExchangesCompleted() {
return exchangesCompleted;
}
Modified: camel/trunk/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/RouteProfile.java
URL: http://svn.apache.org/viewvc/camel/trunk/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/RouteProfile.java?rev=1464379&r1=1464378&r2=1464379&view=diff
==============================================================================
--- camel/trunk/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/RouteProfile.java (original)
+++ camel/trunk/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/RouteProfile.java Thu Apr 4 09:12:35 2013
@@ -83,7 +83,6 @@ public class RouteProfile extends OsgiCo
// TODO: add a row with the route endpoint, so you can see that
// TODO: add column with total time (delta for self time)
- // TODO: ensure the jmx mbeans for processors is sorted correctly
String xml = (String) mBeanServer.invoke(routeMBean, "dumpRouteStatsAsXml", new Object[]{Boolean.FALSE, Boolean.TRUE}, new String[]{"boolean", "boolean"});
RouteStatDump route = (RouteStatDump) unmarshaller.unmarshal(new StringReader(xml));
@@ -93,8 +92,7 @@ public class RouteProfile extends OsgiCo
route.getMeanProcessingTime(), route.getMinProcessingTime(), route.getMaxProcessingTime(), route.getTotalProcessingTime(), 0));
// output in reverse order which prints the route as we want
- for (int i = route.getProcessorStats().size() - 1; i >= 0; i--) {
- ProcessorStatDump ps = route.getProcessorStats().get(i);
+ for (ProcessorStatDump ps : route.getProcessorStats()) {
// the self time is the total time of the processor itself
long selfTime = ps.getTotalProcessingTime();
// indent route id with 2 spaces