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