Tomcat 关闭时报错

最近tomcat走普通的关闭方式无法正常关闭,会报一些Error,用的是Tomcat7,据说是Tomcat7在关闭的时候加了一些检查线程泄漏内存泄露的东西

总结起来,在我项目中有这么几个原因会导致关闭不了:

1、使用了@Scheduled注解

最后查出来原因是因为在bean里面使用了  @Scheduled    注解,而Tomcat关闭的时候,spring并不能主动关闭这些Schedule,也就是说这注解有缺陷,慎用。

替代方法就是放弃spring的Scheduled注解方式使用quartz,这里我把所有的spring注解计划任务换回了配置文件:

<bean id="syncProgramQuartz" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="taskProgramSync">
        </property>
        <property name="targetMethod" value="sync">
        </property>
        <property name="concurrent" value="false">
        </property>
    </bean>

    <bean id="syncProgramQuartzTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="syncProgramQuartz"></property>
        <property name="cronExpression">
            <value>${SYN_PROGRAM_TASK_CRON}</value>
        </property>
    </bean>

    <bean name="startQuertz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="syncProgramQuartzTrigger" />
            </list>
        </property>
    </bean>

这样就不报 pool-xxxx-1无法关闭之类的错误了。

2、连接池没有手动关闭


这个也是在自定义的Listener里面处理,代码如下

new Thread() {
            public void run() {
                Enumeration<Driver> drivers = DriverManager.getDrivers();
                while (drivers.hasMoreElements()) {
                    Driver driver = drivers.nextElement();
                    try {
                        DriverManager.deregisterDriver(driver);
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();

3、AbandonedConnectionCleanupThread单独关闭,这个在关完连接池后就顺便一起关了吧

try {
            AbandonedConnectionCleanupThread.shutdown();
        } catch (InterruptedException e) {
            System.out.println("ContextFinalizer:SEVERE problem cleaning up: " + e.getMessage());
            e.printStackTrace();
        }

一般做完以上三步就差不多了。

4、个别线程强行阻碍

对于这种管不了的线程我们就根据其线程名将其关闭

Set<Thread> threads = Thread.getAllStackTraces().keySet();
          for (Thread thread : threads) {
              if(thread.getName().equals("xxxxxxthread")){
                  try {
                      thread.interrupt();
                      System.out.println(thread.getName()+" is stopped");
                        return;
                   } catch (Exception e) {
                       System.out.println(thread.getName()+" stop error");
                       e.printStackTrace();
                   }
            }
          } 
时间: 2024-10-18 01:58:07

Tomcat 关闭时报错的相关文章

Tomcat启动时报错:java.net.BindException: Permission denied &lt;null&gt;:80 【转载】

本文转载自: http://blog.sina.com.cn/s/blog_4550f3ca0101g37l.html 问题起因:做负载均衡时需要将Web工程与Wap工程同时部署在一台Suse服务器上,为方便日后维护,我们分别为Web工程与Wap工程分配了不同的用户进行部署,并且端口使用分别为8080与80,Web工程使用默认8080端口,Tomcat正常启动并能正常访问,Wap工程使用80端口(修改server.xml),Tomcat启动一系列错误(见问题描述). 问题描述:Tomcat启动时

idea中tomcat启动时报错

之前的项目是用MyEclipse 10 写的项目,之后转移到idea上去,各种配置都弄好后,部署好tomcat启动项目时报错: java.lang.UnsatisfiedLinkError: Can't load AMD 64-bit .dll on a IA 32-bit' platform   从错误信息中大致可以知道是跟计算机的32位和64位相关的问题,后面查阅资料之后知道是jdk和tomcat冲突了,应该是一个是32位一个是64位所以会显示这个错误 可是在cmd中输入java -vers

TOMCAT 关闭报错:Tomcat did not stop in time. PID file was not removed

关闭tomcat的时候,报出如下错误信息: # ./shutdown.sh Using CATALINA_BASE: /opt/openkm-6.3.1-community/tomcat Using CATALINA_HOME: /opt/openkm-6.3.1-community/tomcat Using CATALINA_TMPDIR: /opt/openkm-6.3.1-community/tomcat/temp Using JRE_HOME: /opt/openkm-6.3.1-com

关于文件保存/关闭时报错:文件正由另一进程使用,因此该进程无法访问此文件。

起因:最近给Unity上的游戏写关于存档的脚本,使用了xml.然后发现每次文件保存时,也就是调用XmlDocument.Save()对象方法的时候就会报错说该文件路径分享异常啥的我也不记得了.然后搞了半天,无果.猜测原因可能是因为文件被占用的原因,遂简化代码在新的解决方案里重现异常. 如图: 运行报错,第33行,"文件正由另一进程使用,因此该进程无法访问此文件." 网上找答案,这个异常网上也有答案,虽然他们的代码不是xml相关的但是错误原理相同. 错误原因是:文件正在被流调用.要想保存

Eclipse4.6安装Tomcat插件时报错:Unable to read repository at http://tomcatplugin.sf.net/update/content.xml. Received fatal alert: handshake_failure

错误如下: Unable to read repository at http://tomcatplugin.sf.net/update/content.xml.Received fatal alert: handshake_failure 由于使用的是Eclipse4.6.3,导致安装时提示不能安装此插件,解决方法如下: 1.网络问题,使用VPN. 2.挂载了VPN之后再拖动一次这个按钮到Eclipse中: 此时基本正常,按[Confirm]进行确认. 3.如果实在不行就手动安装.下面为手动安

Tomcat启动时报错:java.net.UnknownHostException

异常信息如下: INFO: Failed to get local InetAddress for VMID. This is unlikely to matter. At all. We'll add some extra randomness java.net.UnknownHostException: ran-oam: ran-oam: Name or service not known at java.net.InetAddress.getLocalHost(InetAddress.ja

Tomcat启动时报错,Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext

解决方法: 修改tomcat配置文件catalina.properties 1 tomcat.util.scan.DefaultJarScanner.jarsToSkip=\ 值后面加",*" 原文地址:https://www.cnblogs.com/hl15/p/10658333.html

tomcat启动时报错

http://www.oschina.net/question/1162040_229925?sort=time 解决:

关闭多实例MySQL时报错

在MySQL刚装好两个实例的环境下,两实例启动后再关闭时报错: [[email protected] ~]# /data/3307/mysql stopStoping MySQL...Enter password: /application/mysql/bin/mysqladmin: connect to server at 'localhost' failederror: 'Access denied for user 'root'@'localhost' (using password: Y