2013-10-31 121 views
20

我開始研究尋找sun.misc.Signal類的替代方法,因爲它可能在即將到來的JDK中不受支持(我們目前正在使用1.6版本)。當我建立這個項目,我得到:sun.misc.Signal的替代方案

警告:sun.misc.SignalHandler是Sun專有的API,並且可以 在將來的版本

我在多個解決方案來移除,但他們不這樣做適合我的項目,例如在this question

  • 信號不僅用於殺滅應用
  • 的應用是巨大的 - 模塊之間的通訊的每一個觀念上的轉變/ JVM上可能需要數年時間來實現
  • ,因爲這是我的情況不可接受

因此,理想的解決方案是找到類似此類的新Oracle版本或類似的工作方式。這樣的解決方案是否存在?

+0

你知道它不支持Java 8或9嗎?鑑於Java很少刪除任何東西,這是一個真正的問題嗎? –

+0

如果有任何可能不支持這一點,我不能冒險。就像我之前說過的那樣 - 這是一個巨大的應用程序,每個可能的失敗都會導致整個項目的災難。) – plancys

+2

您的擔心是有人會在沒有任何想法,測試或警告的情況下將JVM更改爲Java 9,然後責怪如果它不起作用? –

回答

-3

你最好的選擇是從信號轉換,因爲它們沒有得到很好的支持。

替代品IPC:

  • 插座(包括web服務,JMS等)
  • 文件鎖定
  • 內存映射文件
+0

這些替代方法都不能用於例如在控制檯應用程序中處理SIGTERM(Ctrl-C) –

10

作爲學習的時候你會發現重複的循環往復關於Java中的信號處理,我們鼓勵您避免編寫直接依賴於信號的Java代碼。一般的最佳做法是通過註冊shutdown hook代替允許JVM正常退出ctrl + c和其他信號。處理信號直接使您的Java程序依賴於操作系統。

但有時候這沒關係,你確實真的想自己處理信號。

儘管它並未作爲官方JDK API的一部分公開,但JVM的某些部分必須處理信號(以觸發關閉掛鉤並退出),並且該組件是sun.misc.Signal。儘管這是一個實現細節,因此可能會更改,但實際上不太可能。如果要改變,則需要用等效機制來替代,並且可能記錄在Java Platform Troubleshooting Guide中。

兄弟類sun.misc.Unsafe被廣泛使用,並且是similarly undocumented。嘗試刪除此類因爲它是「become a 'dumping ground' for non-standard, yet necessary, methods」正在積極努力,但current proposal在限制某些非標準API的同時保留默認情況下可用sun.misc.Unsafesun.misc.Signal。實際上阻​​止訪問這些類的早期計劃仍然包括一個命令行標誌以允許訪問它們以實現向後兼容。

總之當你不能依靠sun.misc.Signal必須計劃的可能性,這種行爲變化,這是不大可能,這種行爲將JDK 10前改變,如果它無論是新的,更好的機制可能被引入或將有一個合理的方式來重新啓用它,如果需要的話。

然而,將依賴於任何sun.misc類的代碼劃分爲儘可能小的範圍是明智的 - 爲信號處理創建包裝API,以便呼叫者不需要直接與sun.misc進行交互。這樣,如果API更改,只需更改包裝的實現,而不是所有的信號處理代碼。

+0

@specializt在意共享引文或引用?它仍在[JDK 8]的頭版本中(http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/sun/misc/Signal.java)和JEP 260仍然表示'sun.misc。{Signal,SignalHandler}'將「*在JDK 9 *中保持可訪問」。即使JDK 9的計劃發生了變化,在這一點上他們也很難將其從已發佈的JDK 8中移除。 – dimo414