做的系统里有一个批处理调度功能,是用java的timer 及 timertask 实现监控及运行的。这个类由spring管理。
之前发现过,在web容器上停止应用并重新发布WAR包 该类的内的timertask继续执行的情况。当时一个前辈是又写了一个ServletContextListener的子类,并在contextDestroyed 方法里 手工将timertask停掉。问题解决了。但是很奇怪为什么
那个继承了ServletContextListener的类为什么没有配置在web.xml文件里?问题:
1、一个类继承了ServletContextListener,那么它就会自动被web容器识别并被调用里面的方法吗?不用配置到web.xml里吗?(经测试 似乎不行,但是当时问题确实解决了啊?)2、这样的问题大家都是怎么解决的?因为问题似乎又重现了,之前的timertask没有被停掉。我准备的解决方法是将那个继承了ServletContextListener 的listener 配置到web.xml 或者是 在spring里对那个批处理类配置加上 destroy-method 让spring来停掉里面timertask产生的线程

解决方案 »

  1.   

    1、目前来说监听器都是要配置在web.xml中,并且web.xml不可能有多个
    2、你可以写个自己的监听器,然后配置在web.xml中,完全可行的
    不建议使用spring的destroy-method的,除非你的那个批处理类是单例的,否则,spring就不会做处理调用destroy方法的。
      

  2.   

    只能完全停掉你的WEB服务器,并且清空缓存,然后最后再重新部署,再重新启动WEB服务器就好了。