1. 程式人生 > >tomcat宕機自動重啟和每日定時啟動tomcat【工具包系列】

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