2014-03-26 41 views
1

我有一個套接字服務器應用程序。 該應用程序關閉服務器和端口解除綁定標準的Java關閉掛鉤的內部時,過程停止:Java進程的關閉鉤子在gradle守護進程中不會觸發

Runtime.getRuntime().addShutdownHook(new ShutdownHook()); 

我使用的應用程序gradle這個插件來從命令行運行它:

apply plugin: 'application' 
mainClassName = "com.ServerLauncher" 

但是當我運行從gradle申請:

./gradlew :server:run 

然後用ctrl + z關閉應用程序my shutdown hook不會觸發。

我想這是因爲gradle啓動它自己的進程啓動java進程,但它看起來像java進程沒有收到關閉信號。

+0

您是否嘗試使用--stop命令停止它? – fmodos

+0

不,這個怎麼辦? – endryha

回答

1

我已經找到解決方案,以防止這種行爲我需要說gradle這個不運行它的守護線程通過這個命令行參數

./gradlew :server:run --no-daemon 
0

這將是更好地爲您繼續使用該守護進程,因爲它提供各種優點。

然後有一個可能的解決方案,通過發送TERM信號來停止應用程序,而不是停止啓動它的執行的Gradle進程。請查看killjps(或簡單ps)的文檔。

1

默認情況下,當前的Gradle版本使用Gradle守護進程。實際發生的事情是,在按Ctrl + C(我認爲你的意思是它而不是Ctrl + Z)之後,你不只是終止你的應用程序,而是終止整個Gradle進程。大約需要10秒。 Shutdown hooks會被執行,但會延遲,並且當Gradle與控制檯輸出斷開連接時,您將看不到任何消息。

目前最簡單的解決方法是添加--no-daemon開關。

有一個增強建議Gradle來解決這個問題。您可以投票支持:https://github.com/gradle/gradle/issues/1128