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();
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.