2013-12-17 46 views
3

我將Java REST服務從'傳統'方式轉換爲一個簡單的嵌入式設置,作爲一個符合servlet的.war部署到多租戶應用程序服務器(Tomcat) - 其中有一個簡單的Java啓動嵌入式http服務器的主類(Grizzly + Jersey)。一個缺失的部分是服務包裝。我可以通過執行'java -jar myservice.jar'來手動運行該服務,但是我希望將其作爲適當的Linux後臺服務來實現。如何從Bash shell腳本中正常關閉Java服務?

通常,這是通過一個簡單的Bash shell腳本完成的,該腳本放在/etc/init.d中。我見過一些超級簡單的例子,但它們通過進程kill實現關閉,而不是正常關機。我也看到了一些商業工具來處理這個問題,但這個任務看起來太簡單了,以至於不能涉及商業工具。

我的第一個猜測是在第二個監聽關閉請求的端口上添加一個單獨的超級簡單REST服務,並讓/etc/init.d Bash shell腳本以這種方式發送關閉請求。

這個問題有更好或更標準的解決方案嗎?

回答

2

殺是OK(如果它不是kill -9),你應該只執行關機鉤優雅地停止everithing

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 

     @Override 
     public void run() { 
      //TODO stop web server and close db connection if needed 

     } 
    })); 
1

使用控制套接字是處理需要不止一個信號(例如數據庫)的Unix服務的正常關閉的標準方式。他們中的許多人使用Unix域套接字,但使用HTTP來處理這類事情變得很常見。您可以考慮另一個具有受控訪問權限的HTTP URL(通過綁定到不同的套接字或通過編寫邏輯來控制誰可以調用它)或Java RMI。兩者都沒有壓倒一切的優勢。

請注意,無論你在做什麼可能不會是「休息」,並不真正需要;你將要運行一個遠程過程調用。

0

是否有更好或更標準的解決方案,這個問題?

如果您不想監聽HTTP調用或編寫自己的使用套接字的代碼,則可以使用Apache commons-daemon。在這裏看到答案:How to convert a java program to daemon with jsvc?

還有JSWYAJSW它們是相似的。