Java通过调用BAT启动程序,如果启动失败,则删除对应PID,重新启动。
- public void restart(){
- SimpleDateFormat m_sdfNowDate = new SimpleDateFormat("yyyyMMddHHmmss");
- //设定LOG文件。文件名格式为(日期.log)
- File logFile = new File(m_sdfNowDate.format(Calendar.getInstance().getTime())+".log");
- try
- {
- log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":the program is starting.");
- //取得配置文件
- ResourceBundle stats = ResourceBundle.getBundle("config");
- // 取得重新启动的路径
- String sRestartPath = stats.getString("restartPath");
- // 取得重新启动的路径
- String sRestartName = stats.getString("restartname");
- // 取得第一次启动前停留时间
- long nTimeBeforRestart = Long.parseLong(stats.getString("timeBeforRestart"));
- // 取得第二次启动前停留时间
- long nTimeBeforRestartSecond = Long.parseLong(stats.getString("timeBeforRestartSecond"));
- //取得第一次重启所需时间
- long nRestartTimeFirst = Long.parseLong(stats.getString("restartTimeFirst"));
- //取得第二次重启所需时间
- long nRestartTimeSecond = Long.parseLong(stats.getString("restartTimeSecond"));
- //取得PID档案所放置的位置
- String sPidAdress = stats.getString("pidAdress");
- //PID档案集合
- String arrayPidAdress [] = sPidAdress.split(",");
- //重启前PID代号集合
- String arrayPidBefore [] = new String[arrayPidAdress.length];
- //重启后PID代号集合
- String arrayPidAfter [] = new String[arrayPidAdress.length];
- String spidGet = "";
- //获取重启前PID的集合
- for(int i=0;i<arrayPidAdress.length;i++){
- BufferedReader xBuffReadBefore = new BufferedReader(new InputStreamReader(new FileInputStream(arrayPidAdress[i]), "UTF-8"));
- String sPidBefore = xBuffReadBefore.readLine();
- if(sPidBefore==null || sPidBefore.equalsIgnoreCase("")){
- arrayPidBefore[i]="0";
- }else {
- spidGet = spidGet+sPidBefore+":";
- arrayPidBefore[i]=sPidBefore;
- }
- xBuffReadBefore.close();
- }
- log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":the pid getting :"+spidGet);
- log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":waiting befor the first time running.");
- //获取PID后,重启前等待时间
- Thread.currentThread().sleep(nTimeBeforRestart*1000);
- //第一次重新启动服务器
- Runtime.getRuntime().exec("cmd.exe /c "+"start /d "+sRestartPath+" "+sRestartName);
- log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":run the restart and begin the first time running waiting.");
- //第一次启动等待时间
- Thread.currentThread().sleep(nRestartTimeFirst*1000);
- log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":after the first time waiting.");
- //获取第一次启动后的PID的集合。
- for(int i=0;i<arrayPidAdress.length;i++){
- BufferedReader xBuffReadAfter = new BufferedReader(new InputStreamReader(new FileInputStream(arrayPidAdress[i]), "UTF-8"));
- String sPidAfter = xBuffReadAfter.readLine();
- if(sPidAfter==null || sPidAfter.equalsIgnoreCase("")){
- arrayPidAfter[i]="0";
- }else {
- arrayPidAfter[i]=sPidAfter;
- }
- xBuffReadAfter.close();
- }
- //默认设定为已经重新启动
- boolean boolRestartSucess = true;
- //通过PID判断是否成功启动
- for(int i=0;i<arrayPidBefore.length;i++){
- //因为前面已经如果获取的PID为空的情况设定为“0”,此处不处理为空的情况。
- if(arrayPidBefore[i].equalsIgnoreCase(arrayPidAfter[i])){
- boolRestartSucess = false;
- break;
- }
- }
- if(boolRestartSucess){
- //重启成功
- log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":the first time restarting is OK.");
- }else{
- //重启失败
- log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":the first time restarting is Error.");
- //删除java.exe of PID
- for(int i=0;i<arrayPidAfter.length;i++){
- Runtime.getRuntime().exec("ntsd -c q -p "+arrayPidAfter[i]);
- Thread.currentThread().sleep(10000);
- }
- //第二次重启前等待时间
- log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":waiting befor the second time running.");
- Thread.currentThread().sleep(nTimeBeforRestartSecond*1000);
- //第二次重新启动服务器
- Runtime.getRuntime().exec("cmd.exe /c "+"start /d "+sRestartPath+" "+sRestartName);
- log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":run the restart and begin the second time running waiting .");
- //第二次启动等待时间
- Thread.currentThread().sleep(nRestartTimeSecond*1000);
- log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":after the second time waiting.");
- //获取第二次启动后的PID的集合。
- for(int i=0;i<arrayPidAdress.length;i++){
- BufferedReader xBuffReadAfter = new BufferedReader(new InputStreamReader(new FileInputStream(arrayPidAdress[i]), "UTF-8"));
- String sPidAfter = xBuffReadAfter.readLine();
- if(sPidAfter==null || sPidAfter.equalsIgnoreCase("")){
- arrayPidAfter[i]="0";
- }else {
- arrayPidAfter[i]=sPidAfter;
- }
- xBuffReadAfter.close();
- }
- //默认设定为已经重新启动
- boolean boolRestartSucessSecond = true;
- //通过PID判断是否成功启动
- for(int i=0;i<arrayPidBefore.length;i++){
- //因为前面已经如果获取的PID为空的情况设定为“0”,此处不处理为空的情况。
- if(arrayPidBefore[i].equalsIgnoreCase(arrayPidAfter[i])){
- boolRestartSucessSecond = false;
- break;
- }
- }
- if(boolRestartSucessSecond){
- //第二次重启成功。
- log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":the second time restarting is OK.");
- }else{
- //第二次重启失败。
- log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":the second time restarting is Error.");
- }
- log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":the programe is over.");
- }
- }
- catch (Exception e)
- {
- log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":the program has some problem:"+e.toString());
- }
- }
- public void log(File file,String xsContent){
- try {
- FileOutputStream fout = new FileOutputStream(file,true);
- String scontent = xsContent+"/n";
- byte[] b = scontent.getBytes();
- fout.write(b);
- fout.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }