在Java应用程序中,使用关闭钩子自动更新应用程序是一个好主意吗?

在Java应用程序中,使用关闭钩子自动更新应用程序是一个好主意吗?,java,auto-update,shutdown-hook,Java,Auto Update,Shutdown Hook,其思想是在应用程序运行时检查更新。更新由一个主jar和两个第三方jar组成。如果有可用的更新: 下载它们 把它们放在临时目录中 添加一个关机钩子,用临时目录中的jar替换所有实际jar 这是一个好主意吗?如果您希望在关机挂钩周围有一个可靠的系统,那么这不是一个好主意,因为有以下指导原则:- a) 某些情况下可能不会执行关机挂钩。 b) 一旦启动,关闭挂钩可以在完成之前强制停止。 c) 如果定义了多个关闭挂钩,则不能保证它们的执行顺序。 d) 无法使用in-Shutdown钩子注册/注销关闭钩

其思想是在应用程序运行时检查更新。更新由一个主jar和两个第三方jar组成。如果有可用的更新:

  • 下载它们
  • 把它们放在临时目录中
  • 添加一个关机钩子,用临时目录中的jar替换所有实际jar

这是一个好主意吗?

如果您希望在关机挂钩周围有一个可靠的系统,那么这不是一个好主意,因为有以下指导原则:-
a) 某些情况下可能不会执行关机挂钩。
b) 一旦启动,关闭挂钩可以在完成之前强制停止。
c) 如果定义了多个关闭挂钩,则不能保证它们的执行顺序。
d) 无法使用in-Shutdown钩子注册/注销关闭钩子。

有关它的更多信息,请访问Javadoc,网址为:

关机挂钩也应该很快完成工作。当程序调用exit时,预期虚拟机将立即关闭并退出。当虚拟机由于用户注销或系统关闭而终止时,底层操作系统可能只允许一段固定的关闭和退出时间。因此,在关机挂钩中尝试任何用户交互或执行长时间运行的计算是不可取的


因此,您不应该在关机挂钩中进行长时间运行或阻塞活动。

如果您事先要求用户确认,那么“是”是个好主意……;)将两个(小)文件从临时目录复制到另一个目录是否视为长期运行的活动?请注意,这不包括下载时间,因为更新在关机之前已经下载并放在这个临时目录中。此外,我们在Windows和Java 8(正在使用的文件)上更新主JAR时遇到问题。我们最终选择了一个更安全的、已经完成的解决方案:。如果钩子不偶尔执行也可以。他们下一次就要执行了。执行顺序不相关,因为我只有一个钩子。我不需要取消注册挂钩。