Можно ли уведомить веб-приложение о том, что веб-контейнер (например, Tomcat) перезагружается, выгружается или завершает работу? - PullRequest
3 голосов
/ 21 февраля 2010

У меня есть веб-приложение Wicket, работающее в Tomcat. Приложение использует Spring (через org.springframework.web.context.ContextLoaderListener) для инициализации приложения. Это все хорошо и хорошо для запуска, но я также хотел бы получить какое-то уведомление о том, что Контекст уничтожается, чтобы я мог завершить порожденные потоки. Есть ли способ получения такого уведомления? Я включил выдержки из моего заявления, чтобы помочь вам понять мой вопрос.

web.xml extract

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:com/mysite/web/spring/applicationContext.xml</param-value>
</context-param>

<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

Spring applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
    "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

<beans>
    <bean id="MyWebService" class="com.mysite.web.MyWebApp">
    </bean>
</beans>

MyWebApp.java extract

public class MyWebApp extends org.apache.wicket.protocol.http.WebApplication {
    private MyWebServiceServiceAPI webservice =
       MyWebServiceAppImpl.getMyWebService();

    public MyWebServiceWebApp() {
    }

    @Override
    public void init() {
        super.init();
        webservice.start();
    }
}

MyWebServiceAppImpl.java extract

    public class MyWebServiceAppImpl  extends ServiceImpl
        implements MyWebServiceServiceAPI  {
        // The ServiceImpl implements the Callable<T> interface

    private static MyWebServiceServiceAPI instance;
    private List<Future<ServiceImpl>> results =
        new ArrayList<Future<ServiceImpl>>();
    private ExecutorService pool = Executors.newCachedThreadPool();


    private MyWebServiceAppImpl() {
        super(.....);
    }

    public synchronized static MyWebServiceServiceAPI getMyWebService() {
        if (instance == null) {
            instance = new MyWebServiceAppImpl();
            instance.start();
        }
        return instance;
    }

@Override
public synchronized void start() {

    if (!started()) {
        pool.submit(this);
        super.start();
    }
}

1 Ответ

2 голосов
/ 21 февраля 2010

Да, вы можете реализовать свой собственный ContextListener .

package myapp;

public class MyContextListener implements ServletContextListener {



    public void contextInitialized(ServletContextEvent arg0) {
        //called when context is started
    }


    public void contextDestroyed(ServletContextEvent arg0) {
      //called context destroyed
    }   
}

Вам нужно добавить этот слушатель в ваш web.xml

 <listener>
    <listener-class>myapp.MyContextListener</listener-class>
 </listener>
...