Java调用BAT

Java通过调用BAT启动程序,如果启动失败,则删除对应PID,重新启动。

  1. publicvoidrestart(){
  2. SimpleDateFormatm_sdfNowDate=newSimpleDateFormat("yyyyMMddHHmmss");
  3. //设定LOG文件。文件名格式为(日期.log)
  4. FilelogFile=newFile(m_sdfNowDate.format(Calendar.getInstance().getTime())+".log");
  5. try
  6. {
  7. log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":theprogramisstarting.");
  8. //取得配置文件
  9. ResourceBundlestats=ResourceBundle.getBundle("config");
  10. //取得重新启动的路径
  11. StringsRestartPath=stats.getString("restartPath");
  12. //取得重新启动的路径
  13. StringsRestartName=stats.getString("restartname");
  14. //取得第一次启动前停留时间
  15. longnTimeBeforRestart=Long.parseLong(stats.getString("timeBeforRestart"));
  16. //取得第二次启动前停留时间
  17. longnTimeBeforRestartSecond=Long.parseLong(stats.getString("timeBeforRestartSecond"));
  18. //取得第一次重启所需时间
  19. longnRestartTimeFirst=Long.parseLong(stats.getString("restartTimeFirst"));
  20. //取得第二次重启所需时间
  21. longnRestartTimeSecond=Long.parseLong(stats.getString("restartTimeSecond"));
  22. //取得PID档案所放置的位置
  23. StringsPidAdress=stats.getString("pidAdress");
  24. //PID档案集合
  25. StringarrayPidAdress[]=sPidAdress.split(",");
  26. //重启前PID代号集合
  27. StringarrayPidBefore[]=newString[arrayPidAdress.length];
  28. //重启后PID代号集合
  29. StringarrayPidAfter[]=newString[arrayPidAdress.length];
  30. StringspidGet="";
  31. //获取重启前PID的集合
  32. for(inti=0;i<arrayPidAdress.length;i++){
  33. BufferedReaderxBuffReadBefore=newBufferedReader(newInputStreamReader(newFileInputStream(arrayPidAdress[i]),"UTF-8"));
  34. StringsPidBefore=xBuffReadBefore.readLine();
  35. if(sPidBefore==null||sPidBefore.equalsIgnoreCase("")){
  36. arrayPidBefore[i]="0";
  37. }else{
  38. spidGet=spidGet+sPidBefore+":";
  39. arrayPidBefore[i]=sPidBefore;
  40. }
  41. xBuffReadBefore.close();
  42. }
  43. log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":thepidgetting:"+spidGet);
  44. log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":waitingbeforthefirsttimerunning.");
  45. //获取PID后,重启前等待时间
  46. Thread.currentThread().sleep(nTimeBeforRestart*1000);
  47. //第一次重新启动服务器
  48. Runtime.getRuntime().exec("cmd.exe/c"+"start/d"+sRestartPath+""+sRestartName);
  49. log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":runtherestartandbeginthefirsttimerunningwaiting.");
  50. //第一次启动等待时间
  51. Thread.currentThread().sleep(nRestartTimeFirst*1000);
  52. log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":afterthefirsttimewaiting.");
  53. //获取第一次启动后的PID的集合。
  54. for(inti=0;i<arrayPidAdress.length;i++){
  55. BufferedReaderxBuffReadAfter=newBufferedReader(newInputStreamReader(newFileInputStream(arrayPidAdress[i]),"UTF-8"));
  56. StringsPidAfter=xBuffReadAfter.readLine();
  57. if(sPidAfter==null||sPidAfter.equalsIgnoreCase("")){
  58. arrayPidAfter[i]="0";
  59. }else{
  60. arrayPidAfter[i]=sPidAfter;
  61. }
  62. xBuffReadAfter.close();
  63. }
  64. //默认设定为已经重新启动
  65. booleanboolRestartSucess=true;
  66. //通过PID判断是否成功启动
  67. for(inti=0;i<arrayPidBefore.length;i++){
  68. //因为前面已经如果获取的PID为空的情况设定为“0”,此处不处理为空的情况。
  69. if(arrayPidBefore[i].equalsIgnoreCase(arrayPidAfter[i])){
  70. boolRestartSucess=false;
  71. break;
  72. }
  73. }
  74. if(boolRestartSucess){
  75. //重启成功
  76. log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":thefirsttimerestartingisOK.");
  77. }else{
  78. //重启失败
  79. log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":thefirsttimerestartingisError.");
  80. //删除java.exeofPID
  81. for(inti=0;i<arrayPidAfter.length;i++){
  82. Runtime.getRuntime().exec("ntsd-cq-p"+arrayPidAfter[i]);
  83. Thread.currentThread().sleep(10000);
  84. }
  85. //第二次重启前等待时间
  86. log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":waitingbeforthesecondtimerunning.");
  87. Thread.currentThread().sleep(nTimeBeforRestartSecond*1000);
  88. //第二次重新启动服务器
  89. Runtime.getRuntime().exec("cmd.exe/c"+"start/d"+sRestartPath+""+sRestartName);
  90. log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":runtherestartandbeginthesecondtimerunningwaiting.");
  91. //第二次启动等待时间
  92. Thread.currentThread().sleep(nRestartTimeSecond*1000);
  93. log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":afterthesecondtimewaiting.");
  94. //获取第二次启动后的PID的集合。
  95. for(inti=0;i<arrayPidAdress.length;i++){
  96. BufferedReaderxBuffReadAfter=newBufferedReader(newInputStreamReader(newFileInputStream(arrayPidAdress[i]),"UTF-8"));
  97. StringsPidAfter=xBuffReadAfter.readLine();
  98. if(sPidAfter==null||sPidAfter.equalsIgnoreCase("")){
  99. arrayPidAfter[i]="0";
  100. }else{
  101. arrayPidAfter[i]=sPidAfter;
  102. }
  103. xBuffReadAfter.close();
  104. }
  105. //默认设定为已经重新启动
  106. booleanboolRestartSucessSecond=true;
  107. //通过PID判断是否成功启动
  108. for(inti=0;i<arrayPidBefore.length;i++){
  109. //因为前面已经如果获取的PID为空的情况设定为“0”,此处不处理为空的情况。
  110. if(arrayPidBefore[i].equalsIgnoreCase(arrayPidAfter[i])){
  111. boolRestartSucessSecond=false;
  112. break;
  113. }
  114. }
  115. if(boolRestartSucessSecond){
  116. //第二次重启成功。
  117. log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":thesecondtimerestartingisOK.");
  118. }else{
  119. //第二次重启失败。
  120. log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":thesecondtimerestartingisError.");
  121. }
  122. log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":theprogrameisover.");
  123. }
  124. }
  125. catch(Exceptione)
  126. {
  127. log(logFile,m_sdfNowDate.format(Calendar.getInstance().getTime())+":theprogramhassomeproblem:"+e.toString());
  128. }
  129. }
  130. publicvoidlog(Filefile,StringxsContent){
  131. try{
  132. FileOutputStreamfout=newFileOutputStream(file,true);
  133. Stringscontent=xsContent+"\n";
  134. byte[]b=scontent.getBytes();
  135. fout.write(b);
  136. fout.close();
  137. }catch(Exceptione){
  138. e.printStackTrace();
  139. }
  140. }

你可能感兴趣的:(java,thread)