關於tomcat無法 shutdown的問題

2021-08-25 00:16:34 字數 1597 閱讀 9465

關於tomcat無法shutdown的問題:

這個主要是由於tomcat應用服務中有非daemon執行緒沒有關閉。而根據jvm退出規則,只要有非daemon執行緒存在,jvm就不會退出 。

在我們的perlogtask 使用timer.schedule 週期性執行任務,裡面派了出了執行緒,這些執行緒屬於perlogtask的「資源」,也只能由perlogtask去釋放

。而tomcat在shutdown時,它會**了perlogtask本身「資源」,卻不會去**perlogtask申請的「資源」,造成有「資源」沒有釋放,jvm就不會退出。所以在tomcat**perlogtask「資源」時,也應該通知perlogtask**它自己申請的「資源」。

解決方法:

1、注釋掉 perflogtimer。不用這個元件,同時檢查是否還有這種定時程式裡分配了執行緒。

2、把perflogtimer移動到biz-context-core.xml裡,由spring管理。(core-context.xml這個檔案不是由spring管理的 )

增加乙個屬性"destroy-method"

destroy-method="clear" >

因此要公升級類com.paipai.logicframework.common.perstat.perlogtask,增加了clear方法。

對於用com.paipai.logicframework-3.0.1.jar的,可以從持續整合獲取,已經公升級。對於3.0.1版本之前的。替換掉com.paipai.logicframework.common.perstat.perlogtask類 。見附近裡。

同時說明一下:tomcat裡應用服務裡有執行緒相關的,一定要釋放這些執行緒,按「誰申請誰釋放」原則處理。

拍拍api 專案執行在tomcat 等容器中時, 容器未能正常關閉,

比如在tomcat 啟動後, 未能通過使用shutdwon.sh 命令關閉tomcat,

造成這個問題的主要原因是: 容器在軟關閉時, 檢查到容器中還有其他由容器建立的服務尚在執行,

此時容器只有等待所有的服務都結束後, 才會去真正關閉容器.

而我們的api 專案中, 有個spring 的bean 服務(com.paipai.logicframework.common.perstat.perlogtask) 在容器啟動時建立了定時器,

該定時器需要由spring 容器去維護其生命週期( 啟動/ 執行/ 結束),

而在我們的spring 配置檔案中只定義了該服務bena 的啟動方法, 沒有去配置其結束的方法,

這就導致在tomcat 軟關閉時, 沒有結束該定時器的任務, 因此tomcat 一直處於等待關閉的狀態.

spring 的配置檔案如下:

core-context.xml

destroy-method="clear">

效能統計日誌的定時記錄器

任務初始化延遲的時間,以秒為單位

60

tip:

在服務容器中, 對於具有生命週期的服務( 比如定時器/ 具有阻塞方法的服務/ 非同步通訊的服務),

容器都應該主動去管理好這些服務的生命週期, 便於整個容器的啟動/ 關閉和執行維護.

tomcat 無法啟動

tomcat 啟動日誌報出以下錯誤 error transport error 202 bind failed address already in use transport.c l41 error jdwp transport dt socket failed to initialize,tra...

tomcat無法啟動

今天發現伺服器上tomcat 8080埠起不來,老提示埠已經被占用。使用命令 ps aux grep tomcat 發現並沒有8080埠的tomcat程序。使用命令 netstat apn 檢視所有的程序和埠使用情況。發現下面的程序列表,其中最後一欄是pid program name netstat...

tomcat無法登入

按照網路上的教程 如 對安裝目錄下config資料夾中的tomcat users.xml進行設定 xml version 1.0 encoding utf 8 tomcat users role rolename tomcat role rolename manager role rolename ...