注册JVM钩子函数来实现优雅停机

54 阅读1分钟

在各种连接池场景下,当应用发生了关闭。那么所有连接池(数据源、请求业务线程)都会强行的中止线程,如果此时正在发生一些较为重要的业务操作也会被强制停止。

因此作为有经验的工程师,我们会通过Runtime::addShutdownHook()来帮助我们注册JVM的关闭钩子,已达到JVM虚拟机正在关闭时,主动调用shutdown方法关闭线程池释放资源。

	try {
		poolExecutor.shutdown();
		if (!poolExecutor.awaitTermination(AWAIT_SECOND, TimeUnit.SECONDS) {
			poolExecutor.shuwdownNow();
		}
	} catch (InterruptException e) {
		poolExecutor.shutdownNow();
		Thread.currentThread().interrupt();
	}

甚至你可以通过注册关闭钩子来完成内存数据的持久化。

Runtime.getRuntime().addShutdownHook(new Thread(() -> { 
	try (FileWriter writer = new FileWriter("data.txt")) { 
		for (String str : data) { 
			writer.write(str + "\n"); 
		} 
	} catch (IOException e) { 
		e.printStackTrace(); 
	} 
}));