java監聽服務器宕機重啓

package com.zy.lpg.oms; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import java.io.*; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 服務器礦機重啓 */ public class Server { public static int count = 0; private Set<Integer> ports; public static Pattern pattern = Pattern.compile("^ *[a-zA-Z]+ +\\S+"); public static void main(String[] args) { String url = "http://localhost:31000/lpg-oms/lpg/order/heart"; noResponseKillAndStart(2,5000L, 30000L, 31000, url); } /** * 沒有響應殺掉重啓 * @param maxCount 輪詢幾次無響應後就重啓 * @param sleepTime 輪詢時間 * @param restartTime 重啓暫停輪詢時間 * @param port 無響應後需要殺掉的端口 * @param address 心跳地址 */ public static void noResponseKillAndStart(int maxCount, Long sleepTime, Long restartTime, Integer port, String address){ while (true) { try { Thread.sleep(sleepTime); String result = doGet(address); System.out.println("【響應信息】" + result); if (result == null) { count++; } else { count = 0; } if (count == maxCount) { count = 0; // 殺端口 Set<Integer> ports = new HashSet<>(); ports.add(port); gossipPortKill(ports); // 重啓 restart("startOms.bat", "C:\\Users\\Administrator\\Desktop\\"); Thread.sleep(restartTime); } } catch (InterruptedException e) { e.printStackTrace(); } } } /** * 重啓服務器 */ public static void restart(String fileName, String dir){ try { Runtime ec = Runtime.getRuntime(); ec.exec("cmd /C start " + fileName,null, new File(dir)); } catch(Exception e){ e.printStackTrace(); } } /** * 請求服務器是否正常響應 * @return */ public static String doGet(String url) { // 創建Httpclient對象 CloseableHttpClient httpclient = HttpClients.createDefault(); // 創建http GET請求 HttpGet httpGet = new HttpGet(url); CloseableHttpResponse response = null; try { // 執行請求 response = httpclient.execute(httpGet); System.out.println(response.getStatusLine()); // 判斷返回狀態是否爲200 if (response.getStatusLine().getStatusCode() == 200) { String content = EntityUtils.toString(response.getEntity(), "UTF-8"); return content; } } catch (Exception e) { e.printStackTrace(); } finally { if (response != null) { try { response.close(); } catch (IOException e) { e.printStackTrace(); } } try { httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } /** * 清空Gossip端口號 */ public static void gossipPortKill(Set<Integer> ports) { Server kill = new Server(); kill.ports = ports; System.out.println("need kill " + ports.size() + " num"); for (Integer pid : ports) { kill.start(pid); } System.out.println("清理完畢,程序即將退出"); System.out.println("SUCCESS"); } public void start(int port) { Runtime runtime = Runtime.getRuntime(); try { System.out.println("嘗試對" + port + "端口清理..."); //查找進程號 Process p = runtime.exec("cmd /c netstat -ano | findstr \"" + port + "\""); InputStream inputStream = p.getInputStream(); List<String> read = read(inputStream, "UTF-8"); if (read.size() == 0) { System.out.println("找不到該端口的進程"); } else { for (String string : read) { System.out.println(string); } System.out.println("找到" + read.size() + "個進程,正在準備清理"); kill(read); } } catch (IOException e) { e.printStackTrace(); } } /** * 驗證此行是否爲指定的端口,因爲 findstr命令會是把包含的找出來,例如查找80端口,但是會把8099查找出來 * * @param str * @return */ private boolean validPort(String str) { Matcher matcher = pattern.matcher(str); matcher.find(); String find = matcher.group(); int spstart = find.lastIndexOf(":"); find = find.substring(spstart + 1); int port = 0; try { port = Integer.parseInt(find); } catch (NumberFormatException e) { System.out.println("查找到錯誤的端口:" + find); return false; } if (this.ports.contains(port)) { return true; } else { return false; } } /** * 更換爲一個Set,去掉重複的pid值 * * @param data */ public void kill(List<String> data) { Set<Integer> pids = new HashSet<>(); for (String line : data) { int offset = line.lastIndexOf(" "); String spid = line.substring(offset); spid = spid.replaceAll(" ", ""); int pid = 0; try { pid = Integer.parseInt(spid); } catch (NumberFormatException e) { System.out.println("獲取的進程號錯誤:" + spid); } pids.add(pid); } killWithPid(pids); } /** * 一次性殺除所有的端口 * * @param pids */ public void killWithPid(Set<Integer> pids) { for (Integer pid : pids) { try { Process process = Runtime.getRuntime().exec("taskkill /F /pid " + pid + ""); InputStream inputStream = process.getInputStream(); String txt = readTxt(inputStream, "GBK"); System.out.println(txt); } catch (IOException e) { e.printStackTrace(); } } } private List<String> read(InputStream in, String charset) throws IOException { List<String> data = new ArrayList<>(); BufferedReader reader = new BufferedReader(new InputStreamReader(in, charset)); String line; while ((line = reader.readLine()) != null) { boolean validPort = validPort(line); if (validPort) { data.add(line); } } reader.close(); return data; } public String readTxt(InputStream in, String charset) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(in, charset)); StringBuffer sb = new StringBuffer(); String line; while ((line = reader.readLine()) != null) { sb.append(line); } reader.close(); return sb.toString(); } }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章