tomcat宕機自動重啟和每日定時啟動tomcat【工具包系列】
在專案後期維護中會遇到這樣的情況,tomcat在記憶體溢位的時候就出現宕機的情況和遇到長時間不響應,需要人工手動關閉和重啟服務,針對這樣的突發情況,希望程式能自動處理問題而不需要人工關於,所以才有了目前的需求。
一、設定tomcat定時啟動
1,首先將tomcat註冊為服務,先開啟tomcat的bin目錄下service.bat檔案,修改下面的值,這是sevvice的註冊名稱和顯示名稱,一般可使用預設值。
set SERVICE_NAME=Tomcat7 set PR_DISPLAYNAME=Apache Tomcat
【然後修改jvm大小,搜尋到--JvmMs 128 --JvmMx 256 進行修改,因為做成服務啟動,啟動的時候就不會用到 catalina.bat,也就不會讀取裡面的jvm設定了。】(可選,可以不設定)
然後執行cmd命令視窗,cd 到tomcat的bin目錄下,執行下面的命令 service.bat install 執行成功過後,會提示服務已經安裝成功。
2,製作重啟指令碼restart.bat,檔案內容如下 net stop Tomcat7 net start Tomcat7
3,利用控制面板裡面的“任務計劃”設定第2步的指令碼執行時間計劃
4,如果想刪除服務,也很簡單,先把服務停掉,然後在cmd視窗執行下面的命令即可,後面那個Tomcat7是服務名。 sc delete Tomcat7
需要注意的是,需要先把服務停掉,才能一次刪除成功,或者刪除之後再停止服務,就會發現服務已經刪除成功了。
二、監聽tomcat
只要執行start.bat即可,相關配置在config.properties檔案中,預設即可, 如果服務名不對應就修改關閉和啟動命令的服務名即可:net start 【Tomcat7】括號中服務名,然後執行start.bat
下面是具體的監聽程式碼:
首先是監聽類TomcatMonitor .java:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.Properties; /** * @describe:TomcatMonitor.java * * @date 2016-7-4 * @author liuweilong */ public class TomcatMonitor implements Runnable{ String start=""; //系統命令 啟動 String stop=""; //系統命令 關閉 String testHttp=""; //測試連線地址 int testIntervalTime=1;//測試連線間隔時間,單位為秒 int waitIntervalTime=2; //等待測試間隔時間,單位為秒 int testTotalCount=5; //測試連線總次數 Thread thread=null; public TomcatMonitor(){ InputStream in = TomcatMonitor.class.getResourceAsStream("config.properties"); Properties p = new Properties(); try { p.load(in); stop=p.getProperty("stop"); start=p.getProperty("start"); testHttp=p.getProperty("testHttp"); testIntervalTime=Integer.parseInt(p.getProperty("testIntervalTime")); waitIntervalTime=Integer.parseInt(p.getProperty("waitIntervalTime")); testTotalCount=Integer.parseInt(p.getProperty("testTotalCount")); } catch (Exception e) { e.printStackTrace(); } System.out.println("*******************初始化成功!*******************"); thread=new Thread(this); thread.start(); } public void run() { System.out.println("正在監控中..."); int testCount=0; while(true){ testCount=0; testCount++; boolean isrun=test(); System.out.println("正在啟動測試連線,嘗試連線次數為:"+testCount+",結果為:"+(isrun==false?"失敗.":"成功!")); while(!isrun){ if(testCount>=testTotalCount)break; try { thread.sleep(testIntervalTime*1000); } catch (InterruptedException e) { e.printStackTrace(); } testCount++; System.out.println("正在啟動測試連線,嘗試連線次數為:"+testCount+",結果為:"+(isrun==false?"失敗.":"成功!")); isrun=test(); } if(!isrun){ try{ //關閉tomcat服務 Process proc = Runtime.getRuntime().exec(stop); thread.sleep(5000); //啟動tomcat服務 System.out.println("測試連線失敗,正在重啟tomcat"); Process p=Runtime.getRuntime().exec(start); System.out.println("重啟tomcat成功"); }catch(Exception e){ e.printStackTrace(); System.out.println("重啟tomcat異常,請檢視先關錯誤資訊。。。。。"); } } try { thread.sleep(waitIntervalTime*1000); } catch (InterruptedException e) { e.printStackTrace(); } isrun=test(); } } public boolean test(){ URL url=null; try { url = new URL(testHttp); } catch (MalformedURLException e) { e.printStackTrace(); } try { URLConnection urlConn=url.openConnection(); urlConn.setReadTimeout(15000); BufferedReader reader = new BufferedReader(new InputStreamReader( urlConn.getInputStream())); //例項化輸入流,並獲取網頁程式碼 String s; while ((s = reader.readLine()) != null) { return true; } } catch (Exception e) { return false; } return false; } public static void main(String[] args) throws Exception{ TomcatMonitor tm=new TomcatMonitor(); } }
然後是對應的配置檔案config.properties:#系統命令 啟動 start=net start Tomcat7 #關閉 stop = net stop Tomcat7 #測試連線總次數 testTotalCount=3 #連線失敗時,再次檢測時間間隔,單位為秒 testIntervalTime=3 #連線超時時間,即多少秒tomcat沒響應視為宕機,單位為秒 connectionTimeout=15 #tomcat啟動時間,防止在tomcat尚未啟動完成的時候,程式又去檢驗tomcat狀態,造成尚未啟動完成又重新啟動,單位為秒 tomcatStartTime=600 #測試連線地址 testHttp=http://127.0.0.1:8080 #正常情況下,每次檢測間隔時間,單位為秒 waitIntervalTime=30
最後是啟動的start.bat:java -cp . TomcatMonitor