在Java中检测OS Sleep和Wake Up事件

有没有办法让Java程序检测操作系统何时即将进入hibernate状态,或者是否失败,至少检测到唤醒?

实际问题是在特定应用程序中,许多MySQL数据库操作在后台运行。 在Windows机器上进行测试时,这些数据库事务在睡眠/唤醒周期后中断,导致程序中出现大量错误情况。 这些错误通常如下所示:

  java.net.SocketExceptionexception
消息:软件导致连接中止:recv失败 

如果我们能够对“即将入睡”事件作出反应,我们可以尝试暂停后台操作以解决问题。 理想情况下,如果我们能够对“刚刚醒来”事件作出反应,我们至少可以抑制错误消息。

您可以通过定期将当前系统时间与先前系统时间进行比较来检测唤醒。

编辑:这是一个示例,看起来它可以帮助您检测机器何时进入睡眠状态: http : //www.codeguru.com/cpp/wp/system/messagehandling/article.php/c6907

我知道这不是你想要的,但也许正确的答案是尝试编写代码,假设你的套接字不一定会熬夜。 连接可能崩溃的原因有很多,例如因为数据库因维护而被拆除,或者有人因以太网电缆而跳闸。 如果有人在您的应用程序运行时拔出网线,我认为您会遇到类似的错误问题,这些并非闻所未闻,所以也许这是一种更好的方法来尝试优雅地处理这些条件。

你可以只用JNI或JNA来捕获操作系统的睡眠/唤醒事件。

从Windows Power Events(MSDN) ,您必须创建一个Window处理程序和一个空窗口来接收WM_POWERBROADCAST事件。 然后,此窗口过程可以调用Java代码中的事件函数来冒泡消息。