干净的停止tomcat/java应用程序
通常在使用了jdbc或者netty的應用程序中,當shutdown tomcat或java應用程序時,會出現無法停止的情況,報類似如下錯誤:
嚴重:?The?web?application?[]?registered?the?JDBC?driver?[com.mysql.jdbc.Driver]?but?failed?to?unregister?it?when?the?web?application?was?stopped.?To?prevent?a?memory?leak,?the?JDBC?Driver?has?been?forcibly?unregistered.
2014-12-11?17:57:37?org.apache.catalina.loader.WebappClassLoader?clearReferencesThreads
嚴重:?The?web?application?[]?appears?to?have?started?a?thread?named?[FileWatchdog]?but?has?failed?to?stop?it.?This?is?very?likely?to?create?a?memory?leak.
2014-12-11?17:57:37?org.apache.catalina.loader.WebappClassLoader?clearReferencesThreads
嚴重:?The?web?application?[]?appears?to?have?started?a?thread?named?[DefaultQuartzScheduler_Worker-1]?but?has?failed?to?stop?it.?This?is?very?likely?to?create?a?memory?leak.
2014-12-11?17:57:37?org.apache.catalina.loader.WebappClassLoader?clearReferencesThreads
嚴重:?The?web?application?[]?appears?to?have?started?a?thread?named?[DefaultQuartzScheduler_Worker-2]?but?has?failed?to?stop?it.?This?is?very?likely?to?create?a?memory?leak.
2014-12-11?17:57:37?org.apache.catalina.loader.WebappClassLoader?clearReferencesThreads
嚴重:?The?web?application?[]?appears?to?have?started?a?thread?named?[DefaultQuartzScheduler_Worker-3]?but?has?failed?to?stop?it.?This?is?very?likely?to?create?a?memory?leak.
2014-12-11?17:57:37?org.apache.catalina.loader.WebappClassLoader?clearReferencesThreads
嚴重:?The?web?application?[]?appears?to?have?started?a?thread?named?[DefaultQuartzScheduler_Worker-4]?but?has?failed?to?stop?it.?This?is?very?likely?to?create?a?memory?leak.
應該來說,在至少95%的應用中,這個時候采用kill -9殺掉tomcat或java進程的方式并沒有什么問題,因為通常業務進行了檢測,亦或是互聯網應用可以容忍少量的數據不一致性。所以這個時候無需強行介入或者關心,但是如果應用中緩存了相關需要持久化的數據,這個時候就不能直接這么粗暴的停止應用程序了,這會導致數據的不一致性。
在我們公司開發的通信應用框架中,其中支持一種可信的模式,所有請求接收到必須被執行,因此為了最大化性能,我們使用了進程內緩存,同時為了確保盡可能最小化不必要的異常檢測和客戶體驗,我們需要干凈的關閉相關線程池和連接。
在運行于servlet容器的模式下,可通過實現ServletContextListener接口或者繼承spring的ContextLoaderListener類的contextDestroyed方法來釋放相關資源,如下所示:
public void contextDestroyed(ServletContextEvent event) {SpiderShutdownCleaner.shutdown();super.contextDestroyed(event);}當所有的非daemon線程均停止后,對于活動線程而言,其實就是調用Thread.interupt(正常停止)或者stop(強殺,已經deprecated),jvm就會退出。
轉載于:https://www.cnblogs.com/zhjh256/p/6005572.html
總結
以上是生活随笔為你收集整理的干净的停止tomcat/java应用程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle数据库表的导入导出cmd命令
- 下一篇: 【poj3709】 K-Anonymou