public void stop() { synchronized (handlers) { List<Exception> exceptions = Lists.newArrayList(); for (Stage stage : Lists.reverse(stagesOrdered())) { final CopyOnWriteArrayList<Handler> stageHandlers = handlers.get(stage); final ListIterator<Handler> iter = stageHandlers.listIterator(stageHandlers.size()); while (iter.hasPrevious()) { final Handler handler = iter.previous(); try { handler.stop(); } catch (Exception e) { log.warn(e, "exception thrown when stopping %s", handler); exceptions.add(e); } } } started.set(false); if (!exceptions.isEmpty()) { throw Throwables.propagate(exceptions.get(0)); } } }