2017-03-25 76 views
0

我需要java lucene啓動代碼來檢查在JVM崩潰後是否存在被鎖定的write.lock文件,如果需要解鎖它,如何在jvm崩潰後清除lucene write.lock文件的鎖定?

發生JVM崩潰後,lucene沒有機會正確釋放write.lock文件。我需要的是在啓動時檢查這個案例的java lucene代碼,並且在不投擲大油脂LockObtainFailedException的情況下順利處理它。

正在使用Lucene版本5。

+1

只是刪除文件? – freedev

+0

它比這更復雜,正在向客戶端發送軟件升級,關閉舊應用程序並啓動新的二進制文件。舊應用程序無法釋放鎖定文件,因此新升級會引發LockObtainFailed異常。指導每個客戶手動刪除文件非常繁瑣。 –

回答

2

這應該通過刪除鎖定文件來解決Lucene之外的問題。

問題是,新的Lucene實例無法安全地刪除鎖定文件,因爲它不能確定鎖定文件是否存在,因爲現有實例仍在運行。它不能。

您需要的是一個外部應用程序,可以通過測試來查看實例是否仍然存在。您可以使用一些簡單的腳本來構建它:

  • 在「PID文件」中捕獲Lucene實例的PID。
  • 重新啓動Lucene時,請檢查現有的PID文件。如果PID文件存在:
    • 檢查具有該PID的進程是否仍在運行; 例如使用kill -0 <pid>
    • 如果有,請檢查它是否是Lucene進程;例如通過在ps ... <pid>的輸出上進行模式匹配。
  • 如果以上都不是,腳本可以刪除鎖定文件。

如果您的應用程序註冊爲服務(在Linux上),各種「init」和服務管理服務(System V init,upstart,systemd)允許您以受控方式停止和啓動服務。您甚至可以配置服務以在服務崩潰時重新啓動。

第三種方法是使用現有的HA(或類似的)框架在崩潰時自動重新啓動Lucene。現有的框架可能會爲您自己從頭開始開發一些功能。