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

时间:2009-07-31 15:17:36

标签: java mysql database-connection sleep

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

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

java.net.SocketException
MESSAGE: Software caused connection abort: recv failed

如果我们能够对'很快就会入睡'事件做出反应,我们可以尝试暂停后台操作以取代问题。理想情况下,如果我们能够对“刚刚醒来”事件做出反应,我们至少可以抑制错误信息。

3 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

您可以通过JNI或JNA来捕获操作系统中的睡眠/唤醒事件。

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