最近做一个监听Tomcat的程序,监听Tomcat服务是否挂掉,如果挂掉,就使用代码重启Tomcat服务,具体的功能是实现了,当检测到Tomcat挂掉后,我是通过Runtime.getRuntime().exec("路径\\startup.bat")的方式去启动服务,服务能够被启动,可是却连接不上数据库,手工去点击Tomcat目录下的startup.bat是能连接数据库的,不知道手工启动和在程序里面被调用启动有什么区别,还是跟Tomcat的启动机制有什么关联,奇怪的是在我本机能连接上数据库,放在服务器上就不行了,希望各位朋友能够帮忙看看,在此谢过了。
这是负责监听Tomcat的类
/**
* 监听Tomcat服务器是否挂掉,如果挂掉,就自动重启
* @author Thnkpad-Rong
*
*/
public class ListenTomcatStatus implements Runnable{
String checkStr = "sztangang";//用于判断连接是否正常的指定字符
static Map pathMap = new HashMap();//服务器的绝对路径
static Map urlMap = new HashMap(); //服务器地址
private String port; //进行监听的端口号
//初始化路径和地址
static{
pathMap.put("8080", "D:\\Program Files\\Apache Software Foundation\\Tomcat 6.0\\bin\\");
pathMap.put("8081", "D:\\crmwebapp\\crm8081\\apache-tomcat-6.0.20\\bin\\");
pathMap.put("8082", "D:\\crmwebapp\\crm8082\\apache-tomcat-6.0.20\\bin\\");
pathMap.put("8083", "D:\\crmwebapp\\8083\\apache-tomcat-6.0.20\\bin\\");
pathMap.put("8084", "D:\\crmwebapp\\crm8084\\apache-tomcat-6.0.20\\bin\\");
pathMap.put("8085", "D:\\crmwebapp\\crm8085\\apache-tomcat-6.0.20\\bin\\");
urlMap.put("8080", "http://localhost:8080/crm/indexLocal.jsp");
urlMap.put("8081", "http://132.108.200.27:8081/LoginCVM.jsp");
urlMap.put("8082", "http://132.108.200.27:8082/LoginCVM.jsp");
urlMap.put("8083", "http://132.108.200.27:8083/LoginCVM.jsp");
urlMap.put("8084", "http://132.108.200.27:8084/LoginCVM.jsp");
urlMap.put("8085", "http://132.108.200.27:8085/LoginCVM.jsp");
}
public ListenTomcatStatus(String port){
this.port = port;
}
public void tomcatListen(){
//for (int i = 0; i < urlArray.length; i++) {
//statusCheck(pathArray[i],urlArray[i]);
//}
}
/**
* 检查Tomcat服务状态是否运行正常
*/
public synchronized void statusCheck(String port){
String tomcatPath = pathMap.get(port);
String strUrl = urlMap.get(port);
String msg;//接收返回数据
BufferedReader in = null;//输入流
try {
//进行监听的网络地址
URL url = new URL(strUrl);
URLConnection conn = url.openConnection(); //获得连接
conn.setConnectTimeout(4000);//设置连接主机超时
conn.setReadTimeout(4000); //设置读取主机数据超时
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));//读取流
//循环读取数据
while(null!=(msg = in.readLine())){
if(msg.indexOf(checkStr)!=-1){
System.out.println("服务器["+strUrl+"]运行正常");
//读取到了页面并包含指定的数据则证明连接正常,直接跳出方法
return;
}
}
System.out.println(getCurDateForformat("yyyy-MM-dd HH🇲🇲ss")+":主机["+strUrl+"]无响应,服务重启");
//调用tomcat的shutdown.bat、startup.bat重启服务
execCommand(tomcatPath,"shutdown.bat");
execCommand(tomcatPath,"startup.bat");
} catch(Exception s){
System.out.println(getCurDateForformat("yyyy-MM-dd HH🇲🇲ss")+":主机["+strUrl+"]无响应,服务重启");
execCommand(tomcatPath,"shutdown.bat");
execCommand(tomcatPath,"startup.bat");
} finally{
try {
if(in!=null){
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 执行命令
*/
public void execCommand(String command,String type){
BufferedReader in = null;
try {
Process pro = Runtime.getRuntime().exec(command+type);//执行停止或者启动tomcat的命令
in = new BufferedReader(new InputStreamReader(pro.getInputStream()));
while(in.readLine()!=null){
if(type.equals("shutdown.bat")){
//停止tomcat需要几秒的时间缓冲
Thread.currentThread().sleep(5000);
return;
}else if(type.equals("startup.bat")){
Thread.currentThread().sleep(30000);
if(listenPort(Integer.parseInt(port))){
System.out.println("["+port+"]服务重启成功!");
return;
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
if(in!=null){
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 监听端口,判断tomcat是否已经启动
* @param port
* @return
*/
public boolean listenPort(int port){
try {
Socket socket = new Socket("",port);
//如果不抛异常,则证明该端口已被tomcat占用
return true;
} catch (Exception e) {
return false;
}
}
public static String date2Str(Date date) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH🇲🇲ss");
return df.format(date);
}
/**
* 获取当前日期:yyyy-MM-dd
* @return
*/
public static String getCurDateForformat(String format) {
return date2Str(new Date());
}
@Override
public void run() {
statusCheck(port);
}
}
服务器启动了4个Tomcat,所以我用4个线程去监听
/**
* 多线程监听tomcat服务器是否响应正常
* @author Thnkpad-Rong
*
*/
public class ThreadListenTomcat extends TimerTask{
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH🇲🇲ss");
//启动线程进行监听
@Override
public void run() {
System.out.println("--------------------"+df.format(new Date())+"--------------------");
new Thread(new ListenTomcatStatus("8082"),"8082").start();
new Thread(new ListenTomcatStatus("8084"),"8084").start();
new Thread(new ListenTomcatStatus("8085"),"8085").start();
new Thread(new ListenTomcatStatus("8083"),"8083").start();
}
} 最后是定时程序,每隔两分钟监听一次
/**
* 监听主程序
* @author Thnkpad-Rong
*
*/
public class ExceListen {
public static void main(String[] args) {
//使用Timer进行定时监视Tomcat
Timer timer = new Timer();
timer.schedule(new ThreadListenTomcat(), 0, 2*60*1000);
}
} 启动时的报错信息: