最近由于老项目频繁挂掉,由于项目经过多批人之手,短时间难以定位问题,所以只好写一个监控程序。 时间比较紧半天时间,而且水平有限大神勿喷,有好的方法还请赐教。 1、问题描述:分两种情况1.1、tomcat 彻底挂掉端口不会占用进程;1.2、并没有彻底挂掉 端口仍占用进程,但是接口访问异常; 2、解决思路:启动一个java服务轮询(10秒钟一次)程序的一个接口(比如获取当前时间),如果请求不到则查看该端口是否占用进程,如果占用则杀死进程,然后重启tomcat ;如果没有占用进程则直接重启tomca; 本来考虑的是监控多个程序的 但是时间问题就先监控一个吧

3.1 轮训接口

@Service

public class SchedulerService {

private static final Logger logger = LoggerFactory.getLogger(SchedulerService.class);

@Autowired

private KillService killService;

@Value("#{system['jiankong.ports']}")

private String portsStr;

@Value("#{system['url']}")

private String url;

/**

* 监控接口是否通 如果接口不通 或者返回结果不对则重启服务 并发送邮件 每10秒执行一次扫描

* @author gaozemin

* @date 2017年10月18日

* @throws Exception

* @return

*/

public void watch() throws Exception {

String[] ports = portsStr.split(",");

for (String port : ports) {

// 调用测试接口

String ret = HttpUtil.sendPost(url, null);

if (ret == null) {// 如果返回结果为空重启服务

logger.info("返回结果为null ");

killService.start(Integer.valueOf(port));

} else {

try {

Map retMap = JSONObject.parseObject(ret, Map.class);

String retFlag = String.valueOf(retMap.get("result"));

if (!"200".equals(retFlag)) {// 如果返回结果异常 重启服务

killService.start(Integer.valueOf(port));

} else {

logger.info("系统运行正常....");

}

} catch (Exception e) {

logger.info("返回值解析异常....");

killService.start(Integer.valueOf(port));

}

}

logger.info("监控执行中..");

}

}

3.2 如果监控到异常则重启服务

@Service

public class KillService {

private static final Logger logger = LoggerFactory.getLogger(KillService.class);

@Value("#{system['waitTime']}")

private Long waitTime;

@Value("#{system['startTomcatExec']}")

private String startTomcatExec;

@Value("#{system['startLinuxTomcatExec']}")

private String startLinuxTomcatExec;

@Value("#{system['findPid']}")

private String findPid;

@Value("#{system['isLinux']}")

private boolean isLinux;

@Value("#{system['send.emails']}")

private String emails;

@Autowired

private SendMail sendMail;

private Map map = new HashMap();

public void start(int port) {

// 先每10秒 杀死一次进程 然后重启一次 ,执行重启后5分钟后再重新执行扫描,确保程序重新启动

// 1 获取 指定端口的进程号

// 如果调用接口失败则杀死进程并重新启动 ,并记录当前时间 ,否则不进行操作

Date lastExecTime = map.get(port);

if (lastExecTime != null) {// 如果存在重启记录则判断重启时间是否间隔5分钟

Date nowTome = new Date();

Long subTime = nowTome.getTime() - lastExecTime.getTime();

logger.info("间隔时间:{}", subTime);

if (subTime < waitTime) {

logger.info("间隔时间过短 等待程序启动!");

return;

} else {

map.put(port, new Date());

restartTomcat(port, isLinux);

}

} else {

map.put(port, new Date());

restartTomcat(port, isLinux);

}

}

private void restartTomcat(int port, boolean isLinux) {

Runtime runtime = Runtime.getRuntime();

try {

if (isLinux) {

// 查找进程号

linuxRestart(port);

StartTomcatThread a = new StartTomcatThread(startLinuxTomcatExec);

a.start();

} else {

Process p = runtime.exec(findPid + port);

InputStream inputStream = p.getInputStream();

List read = read(port, inputStream, "UTF-8");

if (read.size() == 0) {

logger.info("找不到端口:{}的进程", port);

StartTomcatThread a = new StartTomcatThread(startTomcatExec);

a.start();

logger.info("tomcat已重启");

} else {

logger.info("找到" + read.size() + "个进程,正在准备清理");

kill(read);

StartTomcatThread a = new StartTomcatThread(startTomcatExec);

a.start();

}

}

String dataStr = "admin 服务宕机 现已自动重启 请及时查看日志 修改错误!";

String[] emailStrs = emails.split(",");

for (String email : emailStrs) {

sendMail.sendMsg(email, dataStr);

}

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 验证此行是否为指定的端口,因为 findstr命令会是把包含的找出来,例如查找80端口,但是会把8099查找出来

*

* @param str

* @return

*/

private boolean validPort(int port, String str) {

String patternString = "^ *[a-zA-Z]+ +\\S+";

Pattern pattern = Pattern.compile(patternString);

Matcher matcher = pattern.matcher(str);

matcher.find();

String find = matcher.group();

int spstart = find.lastIndexOf(":");

find = find.substring(spstart + 1);

int findport = 0;

try {

findport = Integer.parseInt(find);

} catch (NumberFormatException e) {

System.out.println("查找到错误的端口:" + find);

return false;

}

if (port == findport) {

return true;

} else {

return false;

}

}

public void linuxRestart(int port) throws IOException, InterruptedException {

String cmd = "kill -9 $(netstat -tlnp|grep " + port + "|awk '{print $7}'|awk -F '/' '{print $1}')";

String[] command = { "sh", "-c", cmd };

Process pro = Runtime.getRuntime().exec(command);

pro.waitFor();

// cmd = path;

// pro = Runtime.getRuntime().exec(cmd);

// pro.waitFor();

}

/**

* 更换为一个Set,去掉重复的pid值

*

* @param data

*/

public void kill(List data) {

Set pids = new HashSet<>();

logger.info("列表:{}" + pids);

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 pids) {

for (Integer pid : pids) {

try {

Process process = Runtime.getRuntime().exec("taskkill /F /pid " + pid + "");

InputStream inputStream = process.getInputStream();

String txt = readTxt(inputStream, "UTF-8");

logger.info(txt);

} catch (IOException e) {

e.printStackTrace();

}

}

}

private List read(int port, InputStream in, String charset) throws IOException {

List data = new ArrayList<>();

BufferedReader reader = new BufferedReader(new InputStreamReader(in, charset));

String line;

while ((line = reader.readLine()) != null) {

boolean validPort = validPort(port, 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();

}

}

java tomcat 监控_java程序监控tomcat实现项目宕机自动重启并发送邮件提醒相关推荐

  1. Tomcat之——宕机自动重启和每日定时启动tomcat

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/60587663 在项目后期维护中会遇到这样的情况,tomcat在内存溢出的时候就出现 ...

  2. tomcat宕机自动重启和每日定时启动tomcat【工具包系列】

    在项目后期维护中会遇到这样的情况,tomcat在内存溢出的时候就出现死机的情况和遇到长时间不响应,需要人工手动关闭和重启服务,针对这样的突发情况,希望程序能自动处理问题而不需要人工关于,所以才有了目前 ...

  3. tomcat宕机自动重启和每日定时启动tomcat

    在项目后期维护中会遇到这样的情况,tomcat在内存溢出的时候就出现死机的情况和遇到长时间不响应,需要人工手动关闭和重启服务,针对这样的突发情况,希望程序能自动处理问题而不需要人工关于,所以才有了目前 ...

  4. java tostring方法_Java程序员小伙启动项目报错,原来是使用了lombok

    每一个程序员在进公司的第一天,可能是在搭建环境,启动项目.小伙在启动 SpringBoot 项目中发现:代码中缺失大量的 getter/setter ,一查原来使用 lombok . 首先,解决项目中 ...

  5. window tomcat 启动后 点击cmd窗口 快速编辑模式导致项目宕机问题

    window tomcat cmd启动后 快速编辑模式导致项目宕机问题 新版本的window 操作系统,cmd默认是开启快速编辑模式 tomcat启动后,如果鼠标无意点击到tomcat cmd窗口 c ...

  6. java 宕机监控_JAVA实现监测tomcat是否宕机及控制重启的方法

    本文实例讲述了JAVA实现监测tomcat是否宕机及控制重启的方法.分享给大家供大家参考.具体如下: Detector.java: import java.net.URL; import java.n ...

  7. java 文件监控_Java 文件监控,实时监控文件加载

    前段时间设计一个文件自动加载系统模块,功能就像是在Tomcat的webapps目录下发布war包那样,只要一有war包加载进来,tomcat立刻就会去解压这个war包,并把它挂载在tomcat上,供网 ...

  8. erp开发和java开发区别_Java程序员求职必学:Spring boot学习指南!

    黑马程序员上海中心 学姐微信:CZBKSH 关注 咳咳,今天学姐就来和你们说说Spring对于Java程序员的重要性. 首先,Spring 官网首页是这么介绍自己的--"Spring: th ...

  9. 容易答错的java面试题_Java程序员面试中最容易答错的8道面试题,你中招了吗?...

    1. static 和 final 的用法 static 的作用从三个方面来谈,分别是静态变量.静态方法.静态类. 静态变量:声明为 static 的静态变量实质上就是全局变量,当声明一个对象时,并不 ...

最新文章

  1. java基础编程题(2)
  2. Visual Studio 2008/2010中Xaml开发格式设置技巧
  3. c语言派,C语言中 派/4=1-1/3+1/5-1/7....公式求派
  4. go语言渐入佳境[9]-doubleloop
  5. oracle bom展开 sql,Oracle EBS-SQL (BOM-15):检查多层BOM(含common BOM).sql
  6. laravel数据库相关操作
  7. 一个会定时完成的任务(二)
  8. 三个变量存在一个协整方程_存在多个协整关系,如何取舍?
  9. 一口气拿到了 8 个 Offer,我该怎么选择?
  10. 编程语言之问:何时该借用,何时该创造?
  11. John the Ripper 密码破解者
  12. nginx rtmp直播无延迟_Ubuntu中使用Nginx+rtmp搭建流媒体直播服务
  13. Visio2007注册码(产品密匙)
  14. html 图片垂直边距,HTML,CSS和垂直文本边距
  15. C#中如何调出工具箱
  16. 硬核,学习 Java 的一点小建议(思维导图,建议收藏)!
  17. 什么是独立站,独立站的作用是什么?
  18. linux飞腾cpu,基于飞腾CPU+银河麒麟操作系统编译安装tensorflow
  19. 股票北向资金数据接口在哪里?
  20. 百度Site查询接口

热门文章

  1. Python 全局变量
  2. markdown-Macdown
  3. Mybatis参数传递及返回类型
  4. UITableView知识梳理须知—(一)
  5. visio生成数据表图
  6. jfinal java搭建_Eclipse快速搭建Jfinal web应用 (一)
  7. 2012服务器系统关闭网络共享,提供网络服务的前提,Windows Server 2012如何更改高级共享设置...
  8. mysql怎么合并行_mysql怎么合并行
  9. 计算机系统备份的原则和策略,计算机系统数据备份机制与策略
  10. linux服务器基本常识,服务器搭建-Linux基础知识