我正在开发一个将作为服务运行的应用程序。我在程序中添加了一个关闭挂钩来进行一些文件清理。当我将程序安装为服务(在 Linux 上作为守护程序或 Windows 服务)时,关闭挂钩会正确执行。但是,在 IDE 中运行时,永远不会执行关闭挂钩。有没有办法在 IDE 中停止正在运行的进程并执行关闭挂钩?
谢谢,巴勃罗
不幸的是,在当前的 Netbeans 系统中没有办法做到这一点,因为两种类型的应用程序测试(调试和正常)的终止方法都可以终止进程,使其没有机会清理。根据您的应用程序的架构,您可能能够添加 System.exit(0) 调用,但除此之外,您还无法在控制台中打开它。
我不同意。根据定义,unix 中的 sigkill 或 windows 中的终止进程将终止正在运行的进程,而不赋予应用程序捕获这些事件的任何能力。这是终止无响应进程所必需的。仅当进程不响应 siginit (ctrl c) 或 sigterm 或 windows 中的结束任务时,才应使用这些信号。NetBeans 似乎发送的是 sigkill 而不是 siginit 或 sigterm。就我而言,这是不好的做法。
应该有一个辅助选项来终止进程,但是主要的结束进程按钮应该是发送 siginit 或 sigterm。应用程序应预期用户在其应用程序上按ctrl c或结束任务,并尽最大努力干净地关闭files/sockets
并保存persistent/state
数据。应用程序不应预期 sigkill 或终止进程,而应以不需要 sigkill 或终止进程的方式开发。
通过 NetBeans 使用这些方法作为从 IDE 终止应用程序的唯一手段是错误的。
没有。不要使用关闭挂钩清理程序。从文档...
在极少数情况下,虚拟机可能会中止,即在没有完全关闭的情况下停止运行。当虚拟机在外部终止时会发生这种情况,例如在 Unix 上使用 SIGKILL 信号或在 Microsoft Windows 上使用 TerminateProcess 调用。如果本地方法出错,例如破坏内部数据结构或尝试访问不存在的内存,虚拟机也可能中止。如果虚拟机中止,则无法保证是否会运行任何关闭挂钩。
当合同说不能保证您的关闭挂钩将始终被调用时,不建议将它们用于关键操作。