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/09/10 12:14:22 UTC

svn commit: r813351 - in /camel/trunk/camel-core/src: main/java/org/apache/camel/impl/ main/java/org/apache/camel/management/ main/java/org/apache/camel/management/event/ main/java/org/apache/camel/spi/ main/java/org/apache/camel/util/ test/java/org/ap...

Author: davsclaus
Date: Thu Sep 10 10:14:21 2009
New Revision: 813351

URL: http://svn.apache.org/viewvc?rev=813351&view=rev
Log:
CAMEL-2000: More roboust when shutting down camel. Notification events fired when a service failed to stop while shutting down Camel.

Added:
    camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/ServiceStoppingFailedEvent.java
      - copied, changed from r813000, camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/CamelContextStartingFailedEvent.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextStopFailureTest.java   (with props)
    camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierServiceStoppingFailedEventTest.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/management/DefaultEventFactory.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultManagementLifecycleStrategy.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/spi/EventFactory.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/util/EventHelper.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/impl/MultipleLifecycleStrategyTest.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=813351&r1=813350&r2=813351&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 Sep 10 10:14:21 2009
@@ -861,7 +861,7 @@
             doStartCamel();
         } catch (Exception e) {
             // fire event that we failed to start
-            EventHelper.notifyCamelContextStartingFailedEvent(this, e);
+            EventHelper.notifyCamelContextStartingFailed(this, e);
             // rethrown cause
             throw e;
         }
@@ -900,6 +900,8 @@
             }
         }
 
+        // start management strategy before lifecycles are started
+        getManagementStrategy().start();
 
         Iterator<LifecycleStrategy> it = lifecycleStrategies.iterator();
         while (it.hasNext()) {
@@ -952,13 +954,23 @@
             LOG.warn("Cannot stop lifecycle strategies: " + e.getMessage());
         }
 
-        LOG.info("Apache Camel " + getVersion() + " (CamelContext:" + getName() + ") stopped");
+
+        // stop management as the last one
+        stopServices(getManagementStrategy());
+
         EventHelper.notifyCamelContextStopped(this);
+        LOG.info("Apache Camel " + getVersion() + " (CamelContext:" + getName() + ") stopped");
     }
 
     private void stopServices(Object service) throws Exception {
         // allow us to do custom work before delegating to service helper
-        ServiceHelper.stopService(service);
+        try {
+            ServiceHelper.stopService(service);
+        } catch (Exception e) {
+            LOG.warn("Error occurred while stopping service: " + service + ". This exception will be ignored.");
+            // fire event
+            EventHelper.notifyServiceStoppingFailed(this, service, e);
+        }
     }
 
     @SuppressWarnings("unchecked")

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultEventFactory.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultEventFactory.java?rev=813351&r1=813350&r2=813351&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultEventFactory.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultEventFactory.java Thu Sep 10 10:14:21 2009
@@ -33,6 +33,7 @@
 import org.apache.camel.management.event.ExchangeFailureHandledEvent;
 import org.apache.camel.management.event.RouteStartedEvent;
 import org.apache.camel.management.event.RouteStoppedEvent;
+import org.apache.camel.management.event.ServiceStoppingFailedEvent;
 import org.apache.camel.spi.EventFactory;
 
 /**
@@ -60,6 +61,10 @@
         return new CamelContextStartingFailedEvent(context, cause);
     }
 
+    public EventObject createServiceStoppingFailedEvent(CamelContext context, Object service, Exception cause) {
+        return new ServiceStoppingFailedEvent(context, service, cause);
+    }
+
     public EventObject createRouteStartedEvent(Route route) {
         return new RouteStartedEvent(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=813351&r1=813350&r2=813351&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 Sep 10 10:14:21 2009
@@ -95,11 +95,8 @@
         try {
             initialized = true;
 
-            // call addService so that context will handle lifecycle on the strategy
-            context.addService(getStrategy());
-
             ManagedCamelContext mc = new ManagedCamelContext(context);
-            getStrategy().manageObject(mc);
+            getManagementStrategy().manageObject(mc);
 
         } catch (Exception e) {
             // must rethrow to allow CamelContext fallback to non JMX agent to allow
@@ -116,8 +113,8 @@
         try {
             ManagedCamelContext mc = new ManagedCamelContext(context);
             // the context could have been removed already
-            if (getStrategy().isManaged(null, mc)) {
-                getStrategy().unmanageObject(mc);
+            if (getManagementStrategy().isManaged(null, mc)) {
+                getManagementStrategy().unmanageObject(mc);
             }
         } catch (Exception e) {
             LOG.warn("Could not unregister CamelContext MBean", e);
@@ -131,7 +128,7 @@
         }
         try {
             Object mc = getManagedObjectForComponent(name, component);
-            getStrategy().manageObject(mc);
+            getManagementStrategy().manageObject(mc);
         } catch (Exception e) {
             LOG.warn("Could not register Component MBean", e);
         }
@@ -144,7 +141,7 @@
         }
         try {
             Object mc = getManagedObjectForComponent(name, component);
-            getStrategy().unmanageObject(mc);
+            getManagementStrategy().unmanageObject(mc);
         } catch (Exception e) {
             LOG.warn("Could not unregister Component MBean", e);
         }
@@ -175,7 +172,7 @@
 
         try {
             Object me = getManagedObjectForEndpoint(endpoint);
-            getStrategy().manageObject(me);
+            getManagementStrategy().manageObject(me);
         } catch (Exception e) {
             LOG.warn("Could not register Endpoint MBean for uri: " + endpoint.getEndpointUri(), e);
         }
@@ -189,7 +186,7 @@
 
         try {
             Object me = getManagedObjectForEndpoint(endpoint);
-            getStrategy().unmanageObject(me);
+            getManagementStrategy().unmanageObject(me);
         } catch (Exception e) {
             LOG.warn("Could not unregister Endpoint MBean for uri: " + endpoint.getEndpointUri(), e);
         }
@@ -222,7 +219,7 @@
         }
 
         // skip already managed services, for example if a route has been restarted
-        if (getStrategy().isManaged(managedObject, null)) {
+        if (getManagementStrategy().isManaged(managedObject, null)) {
             if (LOG.isTraceEnabled()) {
                 LOG.trace("The service is already managed: " + service);
             }
@@ -230,7 +227,7 @@
         }
 
         try {
-            getStrategy().manageObject(managedObject);
+            getManagementStrategy().manageObject(managedObject);
         } catch (Exception e) {
             LOG.warn("Could not register service: " + service + " as Service MBean.", e);
         }
@@ -245,7 +242,7 @@
         Object managedObject = getManagedObjectForService(context, service, route);
         if (managedObject != null) {
             try {
-                getStrategy().unmanageObject(managedObject);
+                getManagementStrategy().unmanageObject(managedObject);
             } catch (Exception e) {
                 LOG.warn("Could not unregister service: " + service + " as Service MBean.", e);
             }
@@ -340,10 +337,10 @@
         }
 
         for (Route route : routes) {
-            ManagedRoute mr = new ManagedRoute(getStrategy(), context, route);
+            ManagedRoute mr = new ManagedRoute(getManagementStrategy(), context, route);
 
             // skip already managed routes, for example if the route has been restarted
-            if (getStrategy().isManaged(mr, null)) {
+            if (getManagementStrategy().isManaged(mr, null)) {
                 if (LOG.isTraceEnabled()) {
                     LOG.trace("The route is already managed: " + route);
                 }
@@ -362,7 +359,7 @@
             }
 
             try {
-                getStrategy().manageObject(mr);
+                getManagementStrategy().manageObject(mr);
             } catch (JMException e) {
                 LOG.warn("Could not register Route MBean", e);
             } catch (Exception e) {
@@ -385,7 +382,7 @@
         Object managedObject = new ManagedErrorHandler(routeContext, errorHandler, errorHandlerBuilder);
 
         // skip already managed services, for example if a route has been restarted
-        if (getStrategy().isManaged(managedObject, null)) {
+        if (getManagementStrategy().isManaged(managedObject, null)) {
             if (LOG.isTraceEnabled()) {
                 LOG.trace("The error handler builder is already managed: " + errorHandlerBuilder);
             }
@@ -393,7 +390,7 @@
         }
 
         try {
-            getStrategy().manageObject(managedObject);
+            getManagementStrategy().manageObject(managedObject);
         } catch (Exception e) {
             LOG.warn("Could not register error handler builder: " + errorHandlerBuilder + " as ErrorHandlerMBean.", e);
         }
@@ -444,7 +441,7 @@
 
         // okay this is a processor we would like to manage so create the
         // performance counter that is the base for processors
-        ManagedPerformanceCounter pc = new ManagedPerformanceCounter(getStrategy());
+        ManagedPerformanceCounter pc = new ManagedPerformanceCounter(getManagementStrategy());
         // set statistics enabled depending on the option
         boolean enabled = context.getManagementStrategy().getStatisticsLevel() == ManagementStatisticsLevel.All;
         pc.setStatisticsEnabled(enabled);
@@ -481,15 +478,15 @@
         }
 
         // only if custom id assigned
-        if (getStrategy().isOnlyManageProcessorWithCustomId()) {
+        if (getManagementStrategy().isOnlyManageProcessorWithCustomId()) {
             return processor.hasCustomIdAssigned();
         }
 
         // use customer filter
-        return getStrategy().manageProcessor(processor);
+        return getManagementStrategy().manageProcessor(processor);
     }
 
-    private ManagementStrategy getStrategy() {
+    private ManagementStrategy getManagementStrategy() {
         return context.getManagementStrategy();
     }
 

Copied: camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/ServiceStoppingFailedEvent.java (from r813000, camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/CamelContextStartingFailedEvent.java)
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/ServiceStoppingFailedEvent.java?p2=camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/ServiceStoppingFailedEvent.java&p1=camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/CamelContextStartingFailedEvent.java&r1=813000&r2=813351&rev=813351&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/CamelContextStartingFailedEvent.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/ServiceStoppingFailedEvent.java Thu Sep 10 10:14:21 2009
@@ -23,14 +23,16 @@
 /**
  * @version $Revision$
  */
-public class CamelContextStartingFailedEvent extends EventObject {
+public class ServiceStoppingFailedEvent extends EventObject {
 
     private CamelContext context;
+    private Object service;
     private Exception cause;
 
-    public CamelContextStartingFailedEvent(CamelContext context, Exception cause) {
-        super(context);
+    public ServiceStoppingFailedEvent(CamelContext context, Object service, Exception cause) {
+        super(service);
         this.context = context;
+        this.service = service;
         this.cause = cause;
     }
 
@@ -38,13 +40,17 @@
         return context;
     }
 
+    public Object getService() {
+        return service;
+    }
+
     public Exception getCause() {
         return cause;
     }
 
     @Override
     public String toString() {
-        return "Starting CamelContext: " + context.getName() + " failed due to " + cause.getMessage();
+        return "Stopping service: " + service + " failed due to " + cause.getMessage();
     }
 
-}
+}
\ No newline at end of file

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/spi/EventFactory.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/EventFactory.java?rev=813351&r1=813350&r2=813351&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/spi/EventFactory.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/spi/EventFactory.java Thu Sep 10 10:14:21 2009
@@ -74,6 +74,16 @@
     EventObject createCamelContextStoppedEvent(CamelContext context);
 
     /**
+     * Creates an {@link EventObject} for a Service failed to stop with success
+     *
+     * @param context camel context
+     * @param service the service
+     * @param cause the cause exception that prevents Camel from starting
+     * @return the created event
+     */
+    EventObject createServiceStoppingFailedEvent(CamelContext context, Object service, Exception cause);
+
+    /**
      * Creates an {@link EventObject} for {@link Route} has been started successfully.
      *
      * @param route the route

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/util/EventHelper.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/EventHelper.java?rev=813351&r1=813350&r2=813351&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/util/EventHelper.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/util/EventHelper.java Thu Sep 10 10:14:21 2009
@@ -71,7 +71,7 @@
         doNotifyEvent(notifier, event);
     }
 
-    public static void notifyCamelContextStartingFailedEvent(CamelContext context, Exception cause) {
+    public static void notifyCamelContextStartingFailed(CamelContext context, Exception cause) {
         EventNotifier notifier = context.getManagementStrategy().getEventNotifier();
         if (notifier == null) {
             return;
@@ -119,6 +119,22 @@
         doNotifyEvent(notifier, event);
     }
 
+    public static void notifyServiceStoppingFailed(CamelContext context, Object service, Exception cause) {
+        EventNotifier notifier = context.getManagementStrategy().getEventNotifier();
+        if (notifier == null) {
+            return;
+        }
+        EventFactory factory = context.getManagementStrategy().getEventFactory();
+        if (factory == null) {
+            return;
+        }
+        EventObject event = factory.createServiceStoppingFailedEvent(context, service, cause);
+        if (event == null) {
+            return;
+        }
+        doNotifyEvent(notifier, event);
+    }
+
     public static void notifyRouteStarted(CamelContext context, Route route) {
         EventNotifier notifier = context.getManagementStrategy().getEventNotifier();
         if (notifier == null) {

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextStopFailureTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextStopFailureTest.java?rev=813351&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextStopFailureTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextStopFailureTest.java Thu Sep 10 10:14:21 2009
@@ -0,0 +1,68 @@
+/**
+ * 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 org.apache.camel.CamelContext;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Service;
+
+/**
+ * @version $Revision$
+ */
+public class DefaultCamelContextStopFailureTest extends ContextTestSupport {
+
+    private static String stopOrder;
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = super.createCamelContext();
+        context.addService(new MyService("A", false));
+        context.addService(new MyService("B", true));
+        context.addService(new MyService("C", false));
+        return context;
+    }
+
+    public void testStopWithFailure() throws Exception {
+        stopOrder = "";
+
+        context.stop();
+
+        assertEquals("CBA", stopOrder);
+    }
+
+    private class MyService implements Service {
+
+        private String name;
+        private boolean fail;
+
+        private MyService(String name, boolean fail) {
+            this.name = name;
+            this.fail = fail;
+        }
+
+        public void start() throws Exception {
+        }
+
+        public void stop() throws Exception {
+            stopOrder = stopOrder + name;
+
+            if (fail) {
+                throw new IllegalArgumentException("Fail " + name);
+            }
+        }
+    }
+}

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

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

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/impl/MultipleLifecycleStrategyTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/impl/MultipleLifecycleStrategyTest.java?rev=813351&r1=813350&r2=813351&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/impl/MultipleLifecycleStrategyTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/impl/MultipleLifecycleStrategyTest.java Thu Sep 10 10:14:21 2009
@@ -50,21 +50,19 @@
 
         context.stop();
 
-        assertEquals(6, dummy1.getEvents().size());
-        assertEquals(6, dummy2.getEvents().size());
+        assertEquals(5, dummy1.getEvents().size());
+        assertEquals(5, dummy2.getEvents().size());
 
-        assertEquals("onServiceAdd", dummy1.getEvents().get(0));
-        assertEquals("onServiceAdd", dummy2.getEvents().get(0));
-        assertEquals("onContextStart", dummy1.getEvents().get(1));
-        assertEquals("onContextStart", dummy2.getEvents().get(1));
-        assertEquals("onComponentAdd", dummy1.getEvents().get(2));
-        assertEquals("onComponentAdd", dummy2.getEvents().get(2));
-        assertEquals("onEndpointAdd", dummy1.getEvents().get(3));
-        assertEquals("onEndpointAdd", dummy2.getEvents().get(3));
-        assertEquals("onComponentRemove", dummy1.getEvents().get(4));
-        assertEquals("onComponentRemove", dummy2.getEvents().get(4));
-        assertEquals("onContextStop", dummy1.getEvents().get(5));
-        assertEquals("onContextStop", dummy2.getEvents().get(5));
+        assertEquals("onContextStart", dummy1.getEvents().get(0));
+        assertEquals("onContextStart", dummy2.getEvents().get(0));
+        assertEquals("onComponentAdd", dummy1.getEvents().get(1));
+        assertEquals("onComponentAdd", dummy2.getEvents().get(1));
+        assertEquals("onEndpointAdd", dummy1.getEvents().get(2));
+        assertEquals("onEndpointAdd", dummy2.getEvents().get(2));
+        assertEquals("onComponentRemove", dummy1.getEvents().get(3));
+        assertEquals("onComponentRemove", dummy2.getEvents().get(3));
+        assertEquals("onContextStop", dummy1.getEvents().get(4));
+        assertEquals("onContextStop", dummy2.getEvents().get(4));
     }
 
 }

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierServiceStoppingFailedEventTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierServiceStoppingFailedEventTest.java?rev=813351&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierServiceStoppingFailedEventTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierServiceStoppingFailedEventTest.java Thu Sep 10 10:14:21 2009
@@ -0,0 +1,112 @@
+/**
+ * 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.EventObject;
+import java.util.List;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Service;
+import org.apache.camel.management.event.CamelContextStartedEvent;
+import org.apache.camel.management.event.CamelContextStartingEvent;
+import org.apache.camel.management.event.CamelContextStoppedEvent;
+import org.apache.camel.management.event.CamelContextStoppingEvent;
+import org.apache.camel.management.event.ServiceStoppingFailedEvent;
+import org.apache.camel.spi.EventNotifier;
+
+/**
+ * @version $Revision$
+ */
+public class EventNotifierServiceStoppingFailedEventTest extends ContextTestSupport {
+
+    private static List<EventObject> events = new ArrayList<EventObject>();
+    private static String stopOrder;
+
+    @Override
+    public void setUp() throws Exception {
+        events.clear();
+        super.setUp();
+    }
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = super.createCamelContext();
+        context.addService(new MyService("A", false));
+        context.addService(new MyService("B", true));
+        context.addService(new MyService("C", false));
+
+        context.getManagementStrategy().setEventNotifier(new EventNotifier() {
+            public void notify(EventObject event) throws Exception {
+                events.add(event);
+            }
+
+            public boolean isEnabled(EventObject event) {
+                return true;
+            }
+        });
+        return context;
+    }
+
+    public void testStopWithFailure() throws Exception {
+        stopOrder = "";
+
+        context.stop();
+
+        assertEquals("CBA", stopOrder);
+
+        assertEquals(5, events.size());
+
+        assertIsInstanceOf(CamelContextStartingEvent.class, events.get(0));
+        assertIsInstanceOf(CamelContextStartedEvent.class, events.get(1));
+        assertIsInstanceOf(CamelContextStoppingEvent.class, events.get(2));
+        ServiceStoppingFailedEvent event = assertIsInstanceOf(ServiceStoppingFailedEvent.class, events.get(3));
+        assertIsInstanceOf(CamelContextStoppedEvent.class, events.get(4));
+
+        assertEquals("Fail B", event.getCause().getMessage());
+        assertEquals("Stopping service: B failed due to Fail B", event.toString());
+    }
+
+    private class MyService implements Service {
+
+        private String name;
+        private boolean fail;
+
+        private MyService(String name, boolean fail) {
+            this.name = name;
+            this.fail = fail;
+        }
+
+        public void start() throws Exception {
+        }
+
+        public void stop() throws Exception {
+            stopOrder = stopOrder + name;
+
+            if (fail) {
+                throw new IllegalArgumentException("Fail " + name);
+            }
+        }
+
+        @Override
+        public String toString() {
+            return name;
+        }
+    }
+    
+}

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

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