【问题标题】:Scala println doesn't work while termination in IDE在 IDE 中终止时,Scala println 不起作用
【发布时间】:2012-07-17 21:37:24
【问题描述】:

我正在编写一个循环运行的服务器,并在 Eclipse IDE 的控制台窗口中按下 SIGINT(ctrl-c) 或终止按钮时终止。我希望它优雅地关闭并打印出终止日志。但问题是 println 在通过按下 Eclipse IDE 中的终止按钮触发关闭序列时似乎不起作用。看下面的简单代码:

object Test extends App {
  println("start")
  Runtime.getRuntime().addShutdownHook(new Thread {
    override def run = println("shutdown")
  })
  synchronized { wait }
}

它适用于命令行 scala 工具。当我按 ctrl-c 时,会打印“开始”和“关闭”这两条消息。但是当我在 Eclipse IDE 中运行它并点击控制台窗口的终止按钮时,不会打印“关闭”消息。它只是默默地终止。我已经验证了关闭挂钩中的其他所有内容在终止时都可以正常运行。只有 println 不起作用。

对此有任何想法吗?我需要打印终止消息以进行日志记录。
提前感谢您的帮助!

【问题讨论】:

    标签: eclipse scala scala-ide


    【解决方案1】:

    关闭进程时 Eclipse 不会运行关闭挂钩:https://bugs.eclipse.org/bugs/show_bug.cgi?id=38016

    该错误报告已解决为不会修复

    我意识到这是一个老错误,所以从那时起事情可能发生了变化。

    【讨论】:

    • 感谢您的链接,钱宁。 (+1 票 :) 很高兴知道问题的历史,而且不仅仅是我有问题。现在情况似乎发生了一些变化。正如我所说,现在可以正确调用关闭挂钩。只有 println 在关机时不工作。
    • 你也可以试试flush System.out
    • 仅供参考,截至 2014 年 9 月,这还没有修复,它也使 scala 的 sys addShutdownHook 不起作用。从外部向 Eclipse 启动的 java 进程发送 SIGTERM 会导致一切按预期工作(包括控制台日志)
    【解决方案2】:

    尝试将关闭消息记录到文件中。 Eclipse 可能会在程序真正终止之前关闭它的 stdout 管道。

    【讨论】:

    • 感谢您的回答,金。这是一种可能的解决方法,它确实有效,尽管我仍在尝试找到一种方法来让控制台工作。如果事实证明此时没有其他选择,我会尽快将您的答案标记为已接受。 ;)
    【解决方案3】:

    你可以试试scala提供的shutDownHook

    sys addShutdownHook(println("shutdown")) 
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 2018-03-05
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    相关资源
    最近更新 更多