美文网首页
web容器关闭时执行方法

web容器关闭时执行方法

作者: 柳岸花开 | 来源:发表于2017-04-28 09:30 被阅读1631次

    第一种,添加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;
                      }
             }
    }

    相关文章

      网友评论

          本文标题:web容器关闭时执行方法

          本文链接:https://www.haomeiwen.com/subject/bwygzttx.html