跳到主要內容

發表文章

目前顯示的是 四月, 2016的文章

自動化重啟 Java Process

有些狀況下會碰到需要關閉 Java process 的狀況
不管是不可預期的,例如 OOM 導致 process crash
或是可預期的狀況,例如需要 Java程式、設定檔更新,而在系統內用 System.exit(0);
通常我們都會需要馬上再重開 Java process,將處理流程自動化會方便得多

Linux  bash 示範

  JPID=0
  while [ $JPID-eq 0 ]
  do

    eval "(java ...)"   # eval your own java process.
    JPID=$?       # set PID to status.

  done

用個迴圈監聽PID是否存在
Windows batch 寫法也是基於同樣概念

:exeLoop
set JPID=-1
for /F "tokens=1" %%i in ('jps -lv ^| find "%MAINCLASS%"') do ( set JPID=%%i )
if %JPID%==-1 (
echo %_EXECJAVA% %JAVA_OPTS% -classpath "%CLASSPATH%" -.... %MAINCLASS%
:: execute your own java process.

ping 127.0.0.1 -n 2 -w 1000 > nul    :: wait for 2 seconds before next loop.
)
goto exeLoop

Java 輸出 Exception 訊息到指定物件

Java 的 Exception 訊息預設會輸出到 Java Console
如果要將訊息另外紀錄在指定的文字檔案,可以採取的作法有兩種

1. 在作業系統下指令將 Java process 的輸出存到指定的文字檔
例如 Linux 環境下
eval \"$_RUNJAVA\" $JAVA_OPTS \ -classpath \"$CLASSPATH\"  >> "/log/err.txt" 2>&1

p.s.  上述的Java相關執行跟參數都是用另外指定的參數,所以請不要直接照抄


2. 將 Exception 存到 String 物件後,再另外用這個 String 做後續處理
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String errMsg = e.getMessage() + "\r\n " + sw.toString();