【问题标题】:Shutdown application gracefully upon power loss断电时优雅地关闭应用程序
【发布时间】:2013-05-16 15:37:42
【问题描述】:

我知道使用 UPS 防止服务器立即关闭的重要性。如何在 Java 应用程序中侦听此类事件?

假设断电后我的 UPS 将继续满载运行 5 分钟。他们的服务器将继续运行,但我的应用程序如何知道是时候开始正常关闭?

这个特定的应用程序主要处理客户端到数据库的事务。如果服务器在 mysql 事务中立即断电,我最关心的是损坏的数据。以下几点是处理电源情况的正确方法吗?

  • 电源熄灭。 UPS 电池模式。应用检测到这一点。
  • 应用程序以某种方式阻止所有传入请求(任何有关这样做的建议都会有所帮助)
  • 在几分钟内,所有正在进行的交易都应该完成。
  • 关闭应用程序
  • 如果电池耗尽,服务器将关闭...等待恢复。

有没有办法在电源恢复时自动重启服务器和应用程序,还是必须手动完成?

【问题讨论】:

  • 应用程序在哪个操作系统上运行?
  • Ubuntu 服务器。应该提到这一点。

标签: java shutdown


【解决方案1】:

处理 UPS 可能必须在操作系统级别处理,使用 SNMP 或系统脚本等监督工具。

你在网上看,你可能会发现很多脚本在接收到来自 UPS 的电源故障事件时执行一些操作。

您必须向您的 JVM PID 发送一个 QUIT 信号(在 Unix/Linux 上),并且在 JVM 端您可以使用方法 Runtime.addShutdownHook 注册一个关闭挂钩

如果使用像 Spring 这样的框架,它肯定已经注册了一些东西,并且如果配置了会调用 bean 的销毁方法。

【讨论】:

  • 这似乎比其他提到的解决方案(监听套接字)更干净一些。真的?这种方式比其他方式有什么好处吗?
  • 通过监听插座并让 UPS 向插座发送信号,您的系统可能会更早地收到警告。通过使用操作系统的内置机制,操作系统在将信号发送到 JVM 之前可能正在做一些其他的事情。但这并不意味着一种选择比另一种更好。如果需要提前通知并通过套接字实现,那么应用程序也应该对 JVM 的关闭事件做出反应,因为关闭可能还有其他原因。
【解决方案2】:

在 Java 应用程序中创建 Java 套接字以侦听来自本地主机的定义端口,并配置 UPS 软件以在断电时向该端口发送事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    相关资源
    最近更新 更多