第一种,添加tomcat启动与关闭事件监听
一:首先,自定义一个监听器类,并实现ServletContextListener,重写里面的contextDestroyed和contextInitialized,将需要进行的操作写在这两个方法中。
public class TomcatListener implements ServletContextListener{ /* (non-Javadoc) * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent) */ @Override public void contextDestroyed(ServletContextEvent arg0) { System.out.println("tomcat关闭了.........."); } /* (non-Javadoc) * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent) */ @Override public void contextInitialized(ServletContextEvent arg0) { System.out.println("tomcate启动了.............."); } }
二:在web.xml中注册该监听器。注册一个监听程序涉及在web.xml的web-app元素内放置一个listener元素。在listener元素内,listener-class元素列出监听程序的完整的限定类名,如下所示:
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>cn.caculate.web.action.TomcatListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener>
虽然listener元素的结构很简单,但请不要忘记,必须正确地给出web-app元素内的子元素的次序。listener元素位于所有的servlet元素之前以及所有filter-mapping元素之后。此外,因为应用生存期监听程序是serlvet规范的2.3版本中的新内容,所以必须使用web.xml DTD的2.3版本及以上,而不是2.2版本。
第二种,使用spring bean的销毁方法。
Spring 容器中的 Bean 是有生命周期的,spring 允许 Bean 在初始化完成后以及销毁前执行特定的操作。下面是常用的三种指定特定操作的方法:
通过实现InitializingBean/DisposableBean 接口来定制初始化之后/销毁之前的操作方法;
通过<bean> 元素的 init-method/destroy-method属性指定初始化之后 /销毁之前调用的操作方法;
在指定方法上加上@PostConstruct或@PreDestroy注解来制定该方法是在初始化之后还是销毁之前调用;
第三种,使用jvm的钩子(hook)
应用场景:某个程序发起了N个线程循环不停做某些事情,正常情况下这些线程需要被安全的停止方可保证数据不丢失,如果停电的情况那就没辙,那么有时候需要关闭服务器,那么如何让jvm告诉其内部的程序现在要关闭了呢?答案是使用钩子(hook)
某个线程需要向jvm注册钩子,让jvm在停止的时候通知它,做法是:
WorkThread extend Thread{
class ShutdownCallbackThread extends Thread{
public void
run(){flag=false;}//设置关闭筏值
}
private boolean
flag=true;
public void run(){
//regist
hook
ShutdownCallbackThread hook = new
ShutdownCallbackThread();
Runtime.getRuntime().addShutdownHook(hook);
while(flag){
....working;
}
}
}
网友评论