分类: Java
2016-08-29 21:51:31
使用Spring注解@PreDestroy,在容器销毁该bean之前执行操作。由于是销毁之前执行,可以安全访问bean中的全部元素。2. 使用钩子函数
使用方式为:在类中某个方法上,打@PreDestroy注解,则Spring在销毁此bean之前会调用该方法。
以上是Spring框架下,对自动加载的bean最常用的销毁前执行方法。当然,仅限程序正常退出。
在Spring的xml文件中配置destroy-method,并在bean中实现该方法,与上结果类似。
在Spring中还有通过bean实现InitializingBean和 DisposableBean接口实现的,不常用。
在jdk1.3之后,java实现了运行时的钩子函数入口。使用钩子函数是在jvm结束之前调用。可以在程序中加入Runtime.getRuntime().addShutdownHook({Thread})方法,则jvm结束时,会执行{thread}.start()。
钩子函数是除了kill -9会忽略外,程序结束都会调用的方法,包括kill, System.exit(), OutOfMemory宕机, 系统关闭等。但是也更底层,由jvm控制执行,不像上述注解。
在执行钩子函数过程中,不执行钩子的其余线程也仍然执行,直到钩子结束。所以如果想在钩子执行时仅有该逻辑执行,就应该在钩子中关闭其他线程池、消息消费者等。
同一个JVM最好只使用一个关闭钩子,以避免一个钩子需要的服务已经被另一个关闭。
钩子中的逻辑尽量简洁,比如将内存中缓存的数据持久化(写入文件等),等待下次启动加载即可。非必要的服务尽量避免在钩子中执行,以加快程序结束速度。
向进程发送退出信号,平滑退出程序。“平滑”包括:
2. 代码级别控制1) 如果在spring容器中,触发springbean的destroy-method回调方法。2) 触发jvm的addShutdownHook。
开线程监听某种信号,出现就system.exit(0)。如监听某file是否存在,某端口是否有命令等。3. kill -9
由于使用代码控制,可以在exit之前编写关闭代码,因此也是一种平滑退出。
强制关闭某进程,不调用钩子直接退出。