您的位置:首页 > 运维架构 > Tomcat

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

2016-11-18 20:37 393 查看
转载至:

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

一、设置tomcat定时启动

1,首先将tomcat注册为服务,先打开tomcat的bin目录下service.bat文件,修改下面的值,这是sevvice的注册名称和显示名称,一般可使用默认值。

set SERVICE_NAME=Tomcat7 set
PR_DISPLAYNAME=Apache Tomcat

【然后修改jvm大小,搜索到--JvmMs 128 --JvmMx 256 进行修改,因为做成服务启动,启动的时候就不会用到 catalina.bat,也就不会读取里面的jvm设置了。】(可选,可以不设置)

然后运行cmd命令窗口,cd 到tomcat的bin目录下,运行下面的命令 service.bat
install 运行成功过后,会提示服务已经安装成功。

2,制作重启脚本restart.bat,文件内容如下 net
stop Tomcat7 net start Tomcat7

3,利用控制面板里面的“任务计划”设置第2步的脚本运行时间计划

4,如果想删除服务,也很简单,先把服务停掉,然后在cmd窗口运行下面的命令即可,后面那个Tomcat7是服务名。 sc
delete Tomcat7

需要注意的是,需要先把服务停掉,才能一次删除成功,或者删除之后再停止服务,就会发现服务已经删除成功了。

二、监听tomcat

 只要运行start.bat即可,相关配置在config.properties文件中,默认即可, 如果服务名不对应就修改关闭和启动命令的服务名即可:net start 【Tomcat7】括号中服务名,然后运行start.bat

下面是具体的监听代码:

首先是监听类TomcatMonitor .Java

[java] view
plain copy

 





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.Properties;  

/** 

 * @describe:TomcatMonitor.java 

 *  

 * @date 2016-7-4 

 * @author liuweilong 

 */  

public class TomcatMonitor implements Runnable{  

      

    String start=""; //系统命令 启动  

    String stop=""; //系统命令 关闭  

    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");  

            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("正在监控中...");     

        int testCount=0;  

        while(true){  

            testCount=0;  

            testCount++;              

            boolean isrun=test();  

            System.out.println("正在启动测试连接,尝试连接次数为:"+testCount+",结果为:"+(isrun==false?"失败.":"成功!"));                 

            while(!isrun){  

                if(testCount>=testTotalCount)break;  

                try {  

                    thread.sleep(testIntervalTime*1000);  

                } catch (InterruptedException e) {  

                    e.printStackTrace();  

                }  

                testCount++;  

                System.out.println("正在启动测试连接,尝试连接次数为:"+testCount+",结果为:"+(isrun==false?"失败.":"成功!"));                 

                isrun=test();  

            }  

              

            if(!isrun){               

                try{        

                    //关闭tomcat服务      

                    Process proc = Runtime.getRuntime().exec(stop);  

                    thread.sleep(5000);  

                    //启动tomcat服务  

                    System.out.println("测试连接失败,正在重启tomcat");  

                    Process p=Runtime.getRuntime().exec(start);   

                    System.out.println("重启tomcat成功");  

                }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(15000);  

            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();  

    }  

      

  

}  

然后是对应的配置文件config.properties:

[plain] view
plain copy

 





#系统命令 启动  

start=net start Tomcat7  

  

#关闭  

stop = net stop Tomcat7  

  

#测试连接总次数  

testTotalCount=3  

  

#连接失败时,再次检测时间间隔,单位为秒  

testIntervalTime=3  

  

#连接超时时间,即多少秒tomcat没响应视为宕机,单位为秒  

connectionTimeout=15  

  

#tomcat启动时间,防止在tomcat尚未启动完成的时候,程序又去检验tomcat状态,造成尚未启动完成又重新启动,单位为秒  

tomcatStartTime=600  

  

#测试连接地址  

testHttp=http://127.0.0.1:8080  

  

#正常情况下,每次检测间隔时间,单位为秒  

waitIntervalTime=30  



最后是启动的start.bat:

[plain] view
plain copy

 





java -cp . TomcatMonitor  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: