1. 程式人生 > >tomcat宕機自動重啟

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