クリーンでグレースフルなシャットダウンを取得しようとしていますが、何らかの理由で実行されません。私はもう試した:
sys addShutdownHook{
logger.warn("SHUTTING DOWN...")
// irrelevant logic here...
}
また:
Runtime.getRuntime.addShutdownHook(ThreadOperations.delayOnThread{
logger.warn("SHUTTING DOWN...")
// irrelevant logic here...
}
)
ThreadOperations.delayOnThread
定義は次のとおりです。
object ThreadOperations {
def startOnThread(body: =>Unit) : Thread = {
onThread(true, body)
}
def delayOnThread(body: =>Unit) : Thread = {
onThread(false, body)
}
private def onThread(runNow : Boolean, body: =>Unit) : Thread = {
val t=new Thread {
override def run=body
}
if(runNow){t.start}
t
}
// more irrelevant operations...
}
しかし、プログラム (実行可能 jar、二重アクティベーション) を実行すると、フックが開始されません。それで、私は何を間違っていますか?scalaにシャットダウンフックを追加する正しい方法は何ですか? それは、私が二重アクティベーションを使用しているという事実に何らかの形で関連していますか?
二重アクティベーションは次のように行われます。
object Gate extends App {
val givenArgs = if(args.isEmpty){
Array("run")
}else{
args
}
val jar = Main.getClass.getProtectionDomain().getCodeSource().getLocation().getFile;
val dir = jar.dropRight(jar.split(System.getProperty("file.separator")).last.length + 1)
val arguments = Seq("java", "-cp", jar, "boot.Main") ++ givenArgs.toSeq
Process(arguments, new java.io.File(dir)).run();
}
(scala バージョン: 2.9.2) ありがとうございます。