/** * Execute the shutdown. * This is exposed purely for testing: do not invoke it. * @return the number of shutdown hooks which timed out. */ @InterfaceAudience.Private @VisibleForTesting static int executeShutdown() { int timeouts = 0; for (HookEntry entry: MGR.getShutdownHooksInOrder()) { Future<?> future = EXECUTOR.submit(entry.getHook()); try { future.get(entry.getTimeout(), entry.getTimeUnit()); } catch (TimeoutException ex) { timeouts++; future.cancel(true); LOG.warn("ShutdownHook '" + entry.getHook().getClass(). getSimpleName() + "' timeout, " + ex.toString(), ex); } catch (Throwable ex) { LOG.warn("ShutdownHook '" + entry.getHook().getClass(). getSimpleName() + "' failed, " + ex.toString(), ex); } } return timeouts; }
@Override public void run() { MGR.shutdownInProgress.set(true); for (Runnable hook: MGR.getShutdownHooksInOrder()) { try { hook.run(); } catch (Throwable ex) { LOG.warn("ShutdownHook '" + hook.getClass().getSimpleName() + "' failed, " + ex.toString(), ex); } } } }
@Override public void run() { MGR.shutdownInProgress.set(true); for (Runnable hook: MGR.getShutdownHooksInOrder()) { try { hook.run(); } catch (Throwable ex) { LOG.warn("ShutdownHook '" + hook.getClass().getSimpleName() + "' failed, " + ex.toString(), ex); } } } }
@Override public void run() { MGR.shutdownInProgress.set(true); for (Runnable hook: MGR.getShutdownHooksInOrder()) { try { hook.run(); } catch (Throwable ex) { LOG.warn("ShutdownHook '" + hook.getClass().getSimpleName() + "' failed, " + ex.toString(), ex); } } } }
@Override public void run() { MGR.shutdownInProgress.set(true); for (HookEntry entry: MGR.getShutdownHooksInOrder()) { Future<?> future = EXECUTOR.submit(entry.getHook()); try {
ShutdownHookManager mgr = ShutdownHookManager.get(); Assert.assertNotNull(mgr); Assert.assertEquals(0, mgr.getShutdownHooksInOrder().size()); Runnable hook1 = new Runnable() { @Override Assert.assertEquals(1, mgr.getShutdownHooksInOrder().size()); Assert.assertEquals(hook1, mgr.getShutdownHooksInOrder().get(0)); mgr.removeShutdownHook(hook1); Assert.assertFalse(mgr.hasShutdownHook(hook1)); Assert.assertEquals(1, mgr.getShutdownHooksInOrder().size()); Assert.assertTrue(mgr.hasShutdownHook(hook1)); Assert.assertEquals(1, mgr.getShutdownHooksInOrder().size()); Assert.assertEquals(2, mgr.getShutdownHooksInOrder().size()); Assert.assertEquals(hook2, mgr.getShutdownHooksInOrder().get(0)); Assert.assertEquals(hook1, mgr.getShutdownHooksInOrder().get(1));
ShutdownHookManager mgr = ShutdownHookManager.get(); Assert.assertNotNull(mgr); Assert.assertEquals(0, mgr.getShutdownHooksInOrder().size()); Runnable hook1 = new Runnable() { @Override Assert.assertEquals(1, mgr.getShutdownHooksInOrder().size()); Assert.assertEquals(hook1, mgr.getShutdownHooksInOrder().get(0)); mgr.removeShutdownHook(hook1); Assert.assertFalse(mgr.hasShutdownHook(hook1)); Assert.assertEquals(1, mgr.getShutdownHooksInOrder().size()); Assert.assertTrue(mgr.hasShutdownHook(hook1)); Assert.assertEquals(1, mgr.getShutdownHooksInOrder().size()); Assert.assertEquals(2, mgr.getShutdownHooksInOrder().size()); Assert.assertEquals(hook2, mgr.getShutdownHooksInOrder().get(0)); Assert.assertEquals(hook1, mgr.getShutdownHooksInOrder().get(1));