tomcat宕機自動重啟
不多說了 直接上程式碼 有問題的 歡迎評論交流
package com.pzx.tomcat;
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.Date;
import java.util.Properties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @describe:TomcatMonitor.java
*
* @date 2018/02/01
* @author pzx
*/
public class TomcatMonitor implements Runnable {
// private static final Logger logger = LoggerFactory.getLogger(TomcatMonitor.class.getName());
String start = ""; // 系統命令 啟動
String stop = ""; // 系統命令 關閉
String killJava = ""; // 強制關閉java的命令
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");
killJava=p.getProperty("killJava");
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("正在監控中...");
// logger.debug("正在監控中...");
int testCount = 0;
while (true) {
testCount = 0;
testCount++;
boolean isrun = test();
System.out.println("正在啟動測試連線,嘗試連線次數為:" + testCount + ",結果為:" + (isrun == false ? "失敗." : "成功!")+"監控時間為:"+new Date());
while (!isrun) {
if (testCount >= testTotalCount)
break;
try {
thread.sleep(testIntervalTime * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
testCount++;
System.out.println("正在啟動測試連線,嘗試連線次數為:" + testCount + ",結果為:" + (isrun == false ? "失敗." : "成功!")+"監控時間為:"+new Date());
isrun = test();
}
if (!isrun) {
try {
System.out.println("測試連線失敗,正在重啟tomcat");
System.out.println("開始停止tomcat");
// 關閉tomcat服務
Process proc = Runtime.getRuntime().exec(stop);
// // 關閉後執行緒沉睡
thread.sleep(20000);
//強制關閉java.exe(正式環境關閉tomcat很長時間黑窗口才關閉 強制殺掉)
try {
System.out.println("開始強制殺程序java.exe");
Process procJava = Runtime.getRuntime().exec(killJava);
//強制殺執行緒後沉睡
thread.sleep(5000);
} catch (Exception e) {
//強制殺執行緒有異常不處理
System.out.println("強制殺程序java.exe異常");
}
System.out.println("開始啟動tomcat");
// 啟動tomcat服務
Process p = Runtime.getRuntime().exec(start);
System.out.println("重啟tomcat成功");
thread.sleep(30000);
//殺掉每次執行命令的黑視窗,預設是不關掉的 不殺的話 會開無限個cmd視窗
killProcess();
} 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(10000);
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();
}
//關閉cmd視窗
public static void killProcess() {
Runtime rt = Runtime.getRuntime();
Process p = null;
try {
rt.exec("cmd.exe /C start wmic process where name='cmd.exe' call terminate");
} catch (IOException e) {
e.printStackTrace();
}
}
}
配置檔案如下:
#系統命令 啟動
start=cmd /c start D:\\tomcat-standard\\bin\\startup.bat
#start=cmd /c start D:\\mh_qianyi\\tomcat8-minhang\\tomcat8-minhang\\bin\\startup.bat
#關閉
#stop=cmd /c start D:\\mh_qianyi\\tomcat8-minhang\\tomcat8-minhang\\bin\\shutdown.bat
stop=cmd /c start D:\\tomcat-standard\\bin\\shutdown.bat
#強制關閉java的命令
killJava=cmd /c start taskkill /f /t /IM java.exe2
#測試連線總次數
testTotalCount=2
#連線失敗時,再次檢測時間間隔,單位為秒
testIntervalTime=5
#連線超時時間,即多少秒tomcat沒響應視為宕機,單位為秒
connectionTimeout=15
#tomcat啟動時間,防止在tomcat尚未啟動完成的時候,程式又去檢驗tomcat狀態,造成尚未啟動完成又重新啟動,單位為秒
tomcatStartTime=600
#測試連線地址
testHttp=http://localhost/mhmscp/login.jsp
#正常情況下,每次檢測間隔時間,單位為秒
waitIntervalTime=120