2011-02-16 37 views
8

我正在使用自定義信號處理程序來捕獲定製Java守護程序中的TERM,ABRT和INT信號。我在代碼中使用了這個處理程序,以便我可以發送TERM信號並通過kill命令正常關閉程序。信號處理程序,現在的作品,但是當我編譯代碼我收到以下警告(許多倍):將信號發送到正在運行的JVM

警告:sun.misc.SignalHandler是Sun的專有API,並可能在將來被移除釋放

而使用這些類:

import sun.misc.SignalHandler; 
import sun.misc.Signal; 

有沒有更好的方式來發送信號到運行中的JVM啓動主線程的關機?我不希望將它的代碼綁定到此API,因爲它將來可能會被刪除。

此代碼現在可以在Solaris和HPUX上使用1.5.0_22 JVM。任何幫助或建議將不勝感激。我用這個文件,從IBM,開發信號處理程序:

http://www.ibm.com/developerworks/java/library/i-signalhandling/

+1

據我所知,沒有用於信號處理的公共API(可能是因爲它太OS特定),所以你必須忍受這個警告。 – biziclop 2011-02-16 23:39:20

回答

17

首先,要明白這只是sun.misc軟件包的標準警告。他們讓你知道你使用的API不是標準的Java API。這並不意味着他們正在積極計劃在將來刪除此API。 http://java.sun.com/products/jdk/faq/faq-sun-packages.html

至於你的問題,它不是很清楚爲什麼java進程處理kill信號的默認方式是不夠的:How to stop java process gracefully?。如果您需要添加其他邏輯,則可以添加shutdown hook

不過,如果你正在尋找其他方式來讓你的java程序知道是時候退出,你可以把它監聽套接字,或標準輸入,或命名管道上...

你可能也想看看JVMTI

+0

「如何優雅地停止java進程」非常有幫助。我做了一個搜索,我不確定我錯過了那一個。我查看了執行kill的腳本,它正在執行「kill -9」。根據鏈接,我認爲我發送了錯誤的信號,並且嚴重地破壞了應用程序(這就是爲什麼我必須在關閉期間捕捉信號以優雅退出)。我將嘗試一個不同的信號,並關閉掛鉤,看看這是否是更好的解決方案。 – jmq 2011-02-17 00:49:17

3

你可以通過JMX做到這一點。 JMX是一套標準的apis,可用於監控和管理java應用程序。

這裏有一些鏈接,讓你開始:

http://onjava.com/pub/a/onjava/2004/09/29/tigerjmx.html

http://www.ibm.com/developerworks/java/library/j-jtp09196/index.html?ca=drs

主要的想法是這樣的:

a)您將有一個布爾變量,說isShutDownTrigerred。你將有一個線程運行一個無限循環,休眠2秒,並不斷檢查這個變量值。值爲true時,您將執行將關閉應用程序的代碼。

b)然後你寫一個mxbean(檢查上面的鏈接)。此mxbean將用於將「isShutDownTrigerred」值更改爲true。您可以使用像jconsole/jManage這樣的工具來查看和修改Java應用程序的mxbeans。只要「isShutDownTriggered」設置爲true,上面的線程就會知道它並將執行關閉應用程序

相關問題