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 2009/08/27 14:32:46 UTC

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

Author: davsclaus
Date: Thu Aug 27 12:32:45 2009
New Revision: 808400

URL: http://svn.apache.org/viewvc?rev=808400&view=rev
Log:
CAMEL-1933: Overhaul of JMX. Improved restarting of routes to properly manage mbeans.

Added:
    camel/trunk/camel-core/src/test/java/org/apache/camel/management/ManagedRouteStopAndStartCleanupTest.java
      - copied, changed from r808328, camel/trunk/camel-core/src/test/java/org/apache/camel/management/ManagedRouteStopAndStartTest.java
Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/Route.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/DefaultRoute.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/impl/RouteService.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultInstrumentationAgent.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultManagedLifecycleStrategy.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/management/ManagedRouteStopAndStartTest.java

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/Route.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/Route.java?rev=808400&r1=808399&r2=808400&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/Route.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/Route.java Thu Aug 27 12:32:45 2009
@@ -38,13 +38,6 @@
     Endpoint getEndpoint();
 
     /**
-     * Sets the inbound endpoint
-     *
-     * @param endpoint the endpoint
-     */
-    void setEndpoint(Endpoint endpoint);
-
-    /**
      * This property map is used to associate information about the route.
      *
      * @return properties
@@ -77,13 +70,6 @@
     List<Service> getServices();
 
     /**
-     * Sets the sources for this route
-     *
-     * @param services the services
-     */
-    void setServices(List<Service> services);
-
-    /**
      * Adds a service to this route
      *
      * @param service the service

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=808400&r1=808399&r2=808400&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 Thu Aug 27 12:32:45 2009
@@ -1001,10 +1001,17 @@
      */
     protected synchronized void startRouteService(RouteService routeService) throws Exception {
         String key = routeService.getId();
-        stopRoute(key);
-        routeServices.put(key, routeService);
-        if (shouldStartRoutes()) {
-            routeService.start();
+        ServiceStatus status = getRouteStatus(key);
+
+        if (status != null && status.isStarted()) {
+            // already started, then stop it
+            LOG.debug("Route " + key + " is already started");
+            return;
+        } else {
+            routeServices.put(key, routeService);
+            if (shouldStartRoutes()) {
+                routeService.start();
+            }
         }
     }
 

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultRoute.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultRoute.java?rev=808400&r1=808399&r2=808400&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultRoute.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultRoute.java Thu Aug 27 12:32:45 2009
@@ -21,7 +21,6 @@
 import java.util.List;
 import java.util.Map;
 
-import org.apache.camel.Channel;
 import org.apache.camel.Endpoint;
 import org.apache.camel.Route;
 import org.apache.camel.Service;
@@ -33,12 +32,11 @@
  *
  * @version $Revision$
  */
-public abstract class DefaultRoute implements Route {
+public abstract class DefaultRoute extends ServiceSupport implements Route {
 
+    private final Endpoint endpoint;
     private final Map<String, Object> properties = new HashMap<String, Object>();
-    private Endpoint endpoint;
-    private List<Service> services = new ArrayList<Service>();
-    private List<Channel> channels = new ArrayList<Channel>();
+    private final List<Service> services = new ArrayList<Service>();
 
     public DefaultRoute(Endpoint endpoint) {
         this.endpoint = endpoint;
@@ -53,7 +51,7 @@
 
     @Override
     public String toString() {
-        return "Route";
+        return "Route " + getId();
     }
 
     public String getId() {
@@ -64,18 +62,6 @@
         return endpoint;
     }
 
-    public void setEndpoint(Endpoint endpoint) {
-        this.endpoint = endpoint;
-    }
-
-    public List<Channel> getChannels() {
-        return channels;
-    }
-
-    public void setChannels(List<Channel> channels) {
-        this.channels = channels;
-    }
-
     public Map<String, Object> getProperties() {
         return properties;
     }
@@ -94,10 +80,6 @@
         return services;
     }
 
-    public void setServices(List<Service> services) {
-        this.services = services;
-    }
-
     public void addService(Service service) {
         getServices().add(service);
     }
@@ -108,4 +90,12 @@
     protected void addServices(List<Service> services) throws Exception {
     }
 
+    protected void doStart() throws Exception {
+    }
+
+    protected void doStop() throws Exception {
+        // clear services when stopping
+        services.clear();
+    }
+
 }

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/RouteService.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/RouteService.java?rev=808400&r1=808399&r2=808400&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/RouteService.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/RouteService.java Thu Aug 27 12:32:45 2009
@@ -100,6 +100,9 @@
             }
             startChildService(list);
 
+            // start the route itself
+            ServiceHelper.startService(route);
+
             // fire event
             EventHelper.notifyRouteStarted(camelContext, route);
         }
@@ -124,6 +127,9 @@
             }
             stopChildService(list);
 
+            // stop the route itself
+            ServiceHelper.stopService(route);
+
             // fire event
             EventHelper.notifyRouteStopped(camelContext, route);
         }

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultInstrumentationAgent.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultInstrumentationAgent.java?rev=808400&r1=808399&r2=808400&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultInstrumentationAgent.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultInstrumentationAgent.java Thu Aug 27 12:32:45 2009
@@ -214,6 +214,9 @@
     public void unregister(ObjectName name) throws JMException {
         server.unregisterMBean(name);
         mbeansRegistered.remove(name);
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Unregistered MBean with objectname: " + name);
+        }
     }
 
     public boolean isRegistered(ObjectName name) {

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultManagedLifecycleStrategy.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultManagedLifecycleStrategy.java?rev=808400&r1=808399&r2=808400&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultManagedLifecycleStrategy.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultManagedLifecycleStrategy.java Thu Aug 27 12:32:45 2009
@@ -246,6 +246,15 @@
             // regular for services
             managedObject = getManagedObjectForService(context, service);
         }
+
+        // skip already managed services, for example if a route has been restarted
+        if (getStrategy().isManaged(managedObject, null)) {
+            if (LOG.isTraceEnabled()) {
+                LOG.trace("The service is already managed: " + service);
+            }
+            return;
+        }
+
         try {
             getStrategy().manageObject(managedObject);
         } catch (Exception e) {
@@ -335,6 +344,14 @@
         for (Route route : routes) {
             ManagedRoute mr = new ManagedRoute(getStrategy(), context, route);
 
+            // skip already managed routes, for example if the route has been restarted
+            if (getStrategy().isManaged(mr, null)) {
+                if (LOG.isTraceEnabled()) {
+                    LOG.trace("The route is already managed: " + route);
+                }
+                continue;
+            }
+
             // get the wrapped instrumentation processor from this route
             // and set me as the counter
             if (route instanceof EventDrivenConsumerRoute) {
@@ -357,12 +374,7 @@
     }
 
     public void onRoutesRemove(Collection<Route> routes) {
-        // the agent hasn't been started
-        if (!initialized) {
-            return;
-        }
-
-        // keep the route in the mbean so its still there, it will still be unregistered
+        // noop - keep the route in the mbean so its still there, it will still be unregistered
         // when camel itself is shutting down
     }
 

Copied: camel/trunk/camel-core/src/test/java/org/apache/camel/management/ManagedRouteStopAndStartCleanupTest.java (from r808328, camel/trunk/camel-core/src/test/java/org/apache/camel/management/ManagedRouteStopAndStartTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/management/ManagedRouteStopAndStartCleanupTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/management/ManagedRouteStopAndStartCleanupTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/management/ManagedRouteStopAndStartTest.java&r1=808328&r2=808400&rev=808400&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/management/ManagedRouteStopAndStartTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/management/ManagedRouteStopAndStartCleanupTest.java Thu Aug 27 12:32:45 2009
@@ -20,23 +20,18 @@
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
 
-import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
 import org.apache.camel.ServiceStatus;
-import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 
 /**
+ * Extended test to see if mbeans is removed and stats are correct
+ *
  * @version $Revision$
  */
-public class ManagedRouteStopAndStartTest extends ContextTestSupport {
-
-    @Override
-    protected void setUp() throws Exception {
-        deleteDirectory("target/managed");
-        super.setUp();
-    }
+public class ManagedRouteStopAndStartCleanupTest extends ManagedRouteStopAndStartTest {
 
+    @SuppressWarnings("unchecked")
     public void testStopAndStartRoute() throws Exception {
         MBeanServer mbeanServer = context.getManagementStrategy().getManagementAgent().getMBeanServer();
         ObjectName on = getRouteObjectName(mbeanServer);
@@ -52,12 +47,33 @@
         String state = (String) mbeanServer.getAttribute(on, "State");
         assertEquals("Should be started", ServiceStatus.Started.name(), state);
 
+        // need a bit time to let JMX update
+        Thread.sleep(1000);
+
+        // should have 1 completed exchange
+        Long completed = (Long) mbeanServer.getAttribute(on, "ExchangesCompleted");
+        assertEquals(1, completed.longValue());
+
+        // should be 1 consumer and 1 processor
+        Set<ObjectName> set = mbeanServer.queryNames(new ObjectName("*:type=consumers,*"), null);
+        assertEquals("Should be 1 consumer", 1, set.size());
+
+        set = mbeanServer.queryNames(new ObjectName("*:type=processors,*"), null);
+        assertEquals("Should be 1 processor", 1, set.size());
+
         // stop
         mbeanServer.invoke(on, "stop", null, null);
 
         state = (String) mbeanServer.getAttribute(on, "State");
         assertEquals("Should be stopped", ServiceStatus.Stopped.name(), state);
 
+        // should be 0 consumer and 0 processor
+        set = mbeanServer.queryNames(new ObjectName("*:type=consumers,*"), null);
+        assertEquals("Should be 0 consumer", 0, set.size());
+
+        set = mbeanServer.queryNames(new ObjectName("*:type=processors,*"), null);
+        assertEquals("Should be 0 processor", 0, set.size());
+
         mock.reset();
         mock.expectedBodiesReceived("Bye World");
         // wait 3 seconds while route is stopped to verify that file was not consumed
@@ -78,25 +94,22 @@
         state = (String) mbeanServer.getAttribute(on, "State");
         assertEquals("Should be started", ServiceStatus.Started.name(), state);
 
+        // should be 1 consumer and 1 processor
+        set = mbeanServer.queryNames(new ObjectName("*:type=consumers,*"), null);
+        assertEquals("Should be 1 consumer", 1, set.size());
+
+        set = mbeanServer.queryNames(new ObjectName("*:type=processors,*"), null);
+        assertEquals("Should be 1 processor", 1, set.size());
+
         // this time the file is consumed
         mock.assertIsSatisfied();
-    }
-
-    private static ObjectName getRouteObjectName(MBeanServer mbeanServer) throws Exception {
-        Set<ObjectName> set = mbeanServer.queryNames(new ObjectName("*:type=routes,*"), null);
-        assertEquals(1, set.size());
 
-        return set.iterator().next();
-    }
+        // need a bit time to let JMX update
+        Thread.sleep(1000);
 
-    @Override
-    protected RouteBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("file://target/managed").to("mock:result");
-            }
-        };
+        // should have 2 completed exchange
+        completed = (Long) mbeanServer.getAttribute(on, "ExchangesCompleted");
+        assertEquals(2, completed.longValue());
     }
 
-}
+}
\ No newline at end of file

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/management/ManagedRouteStopAndStartTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/management/ManagedRouteStopAndStartTest.java?rev=808400&r1=808399&r2=808400&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/management/ManagedRouteStopAndStartTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/management/ManagedRouteStopAndStartTest.java Thu Aug 27 12:32:45 2009
@@ -82,7 +82,7 @@
         mock.assertIsSatisfied();
     }
 
-    private static ObjectName getRouteObjectName(MBeanServer mbeanServer) throws Exception {
+    static ObjectName getRouteObjectName(MBeanServer mbeanServer) throws Exception {
         Set<ObjectName> set = mbeanServer.queryNames(new ObjectName("*:type=routes,*"), null);
         assertEquals(1, set.size());