Author: ningjiang
Date: Fri May 14 23:53:51 2010
New Revision: 944519

URL: http://svn.apache.org/viewvc?rev=944519&view=rev
Log:
CAMEL-2722 ManagedRoute should be unregister when CamelContext shutdown the 
route

Added:
    
camel/trunk/camel-core/src/test/java/org/apache/camel/management/RemoveRouteDefinitionTest.java
   (with props)
Modified:
    
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.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/DefaultManagementLifecycleStrategy.java

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=944519&r1=944518&r2=944519&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
 Fri May 14 23:53:51 2010
@@ -568,6 +568,7 @@ public class DefaultCamelContext extends
     public synchronized void shutdownRoute(String routeId) throws Exception {
         RouteService routeService = routeServices.get(routeId);
         if (routeService != null) {
+            routeService.setRemovingRoutes(true);
             List<RouteStartupOrder> routes = new 
ArrayList<RouteStartupOrder>(1);
             RouteStartupOrder order = new DefaultRouteStartupOrder(1, 
routeService.getRoutes().iterator().next(), routeService);
             routes.add(order);
@@ -581,6 +582,7 @@ public class DefaultCamelContext extends
     public synchronized void shutdownRoute(String routeId, long timeout, 
TimeUnit timeUnit) throws Exception {
         RouteService routeService = routeServices.get(routeId);
         if (routeService != null) {
+            routeService.setRemovingRoutes(true);
             List<RouteStartupOrder> routes = new 
ArrayList<RouteStartupOrder>(1);
             RouteStartupOrder order = new DefaultRouteStartupOrder(1, 
routeService.getRoutes().iterator().next(), routeService);
             routes.add(order);

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=944519&r1=944518&r2=944519&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 
Fri May 14 23:53:51 2010
@@ -51,6 +51,7 @@ public class RouteService extends Servic
     private final List<RouteContext> routeContexts;
     private final List<Route> routes;
     private final String id;
+    private boolean removingRoutes;
     private boolean startInputs = true;
     private final Map<Route, Consumer> inputs = new HashMap<Route, Consumer>();
 
@@ -101,6 +102,14 @@ public class RouteService extends Servic
     public Map<Route, Consumer> getInputs() {
         return inputs;
     }
+    
+    public boolean isRemovingRoutes() {
+        return removingRoutes;
+    }
+    
+    public void setRemovingRoutes(boolean removingRoutes) {
+        this.removingRoutes = removingRoutes;
+    }
 
     protected void doStart() throws Exception {
         camelContext.addRouteCollection(routes);
@@ -160,14 +169,17 @@ public class RouteService extends Servic
     protected void doStop() throws Exception {
         // clear inputs
         inputs.clear();
-
-        for (LifecycleStrategy strategy : 
camelContext.getLifecycleStrategies()) {
-            strategy.onRoutesRemove(routes);
-        }
-
+        
         // if we are stopping CamelContext then we are shutting down
         boolean isShutdownCamelContext = camelContext.isStopping();
 
+        if (isShutdownCamelContext || isRemovingRoutes()) {
+            // need to call onRoutesRemove when the CamelContext is shutting 
down or Route is shutdown
+            for (LifecycleStrategy strategy : 
camelContext.getLifecycleStrategies()) {
+                strategy.onRoutesRemove(routes);
+            }
+        }
+        
         for (Route route : routes) {
             if (LOG.isTraceEnabled()) {
                 LOG.trace("Stopping route: " + route);

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=944519&r1=944518&r2=944519&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
 Fri May 14 23:53:51 2010
@@ -420,6 +420,32 @@ public class DefaultManagementLifecycleS
     public void onRoutesRemove(Collection<Route> routes) {
         // noop - keep the route in the mbean so its still there, it will 
still be unregistered
         // when camel itself is shutting down
+        
+        // the agent hasn't been started
+        if (!initialized) {
+            return;
+        }
+
+        for (Route route : routes) {            
+            ManagedRoute mr = new ManagedRoute(camelContext, route);
+            mr.init(getManagementStrategy());
+
+            // skip unmanaged routes
+            if (!getManagementStrategy().isManaged(mr, null)) {
+                if (LOG.isTraceEnabled()) {
+                    LOG.trace("The route is already managed: " + route);
+                }
+                continue;
+            }
+
+            try {
+                getManagementStrategy().unmanageObject(mr);
+            } catch (JMException e) {
+                LOG.warn("Could not register Route MBean", e);
+            } catch (Exception e) {
+                LOG.warn("Could not create Route MBean", e);
+            }
+        }
     }
 
     public void onErrorHandlerAdd(RouteContext routeContext, Processor 
errorHandler, ErrorHandlerBuilder errorHandlerBuilder) {

Added: 
camel/trunk/camel-core/src/test/java/org/apache/camel/management/RemoveRouteDefinitionTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/management/RemoveRouteDefinitionTest.java?rev=944519&view=auto
==============================================================================
--- 
camel/trunk/camel-core/src/test/java/org/apache/camel/management/RemoveRouteDefinitionTest.java
 (added)
+++ 
camel/trunk/camel-core/src/test/java/org/apache/camel/management/RemoveRouteDefinitionTest.java
 Fri May 14 23:53:51 2010
@@ -0,0 +1,96 @@
+/**
+ * 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 java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.ServiceStatus;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.RouteDefinition;
+
+/**
+ * @version $Revision$
+ */
+public class RemoveRouteDefinitionTest extends ContextTestSupport {
+
+    @Override
+    protected boolean useJmx() {
+        return true;
+    }
+
+    @SuppressWarnings("unchecked")
+    public void testShutdownRoute() throws Exception {
+        
+        MBeanServer mbeanServer = 
context.getManagementStrategy().getManagementAgent().getMBeanServer();
+
+        Set<ObjectName> set = mbeanServer.queryNames(new 
ObjectName("*:type=routes,*"), null);
+        assertEquals(1, set.size());
+
+        ObjectName on = set.iterator().next();
+        
+        boolean registered = mbeanServer.isRegistered(on);
+        assertEquals("Should be registered", true, registered);
+        
+        RouteDefinition definition = context.getRouteDefinition("route1");
+        List<RouteDefinition> routeDefinitions = new 
ArrayList<RouteDefinition>();
+        routeDefinitions.add(definition);
+        context.shutdownRoute("route1");
+
+        set = mbeanServer.queryNames(new ObjectName("*:type=routes,*"), null);
+        assertEquals(0, set.size());
+        
+    }
+    
+    @SuppressWarnings("unchecked")
+    public void testStopRoute() throws Exception {
+        
+        MBeanServer mbeanServer = 
context.getManagementStrategy().getManagementAgent().getMBeanServer();
+
+        Set<ObjectName> set = mbeanServer.queryNames(new 
ObjectName("*:type=routes,*"), null);
+        assertEquals(1, set.size());
+
+        ObjectName on = set.iterator().next();
+        
+        boolean registered = mbeanServer.isRegistered(on);
+        assertEquals("Should be registered", true, registered);
+        
+        RouteDefinition definition = context.getRouteDefinition("route1");
+        List<RouteDefinition> routeDefinitions = new 
ArrayList<RouteDefinition>();
+        routeDefinitions.add(definition);
+        context.stopRoute("route1");
+
+        set = mbeanServer.queryNames(new ObjectName("*:type=routes,*"), null);
+        assertEquals(1, set.size());
+        
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                
from("direct:start").routeId("route1").to("log:foo").to("mock:result");
+            }
+        };
+    }
+
+}
\ No newline at end of file

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

Propchange: 
camel/trunk/camel-core/src/test/java/org/apache/camel/management/RemoveRouteDefinitionTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date


Reply via email to