Обнаружение событий сна и пробуждения ОС в Java - PullRequest
7 голосов
/ 31 июля 2009

Есть ли способ для Java-программы определить, когда операционная система собирается перейти в спящий режим, или, если это не удалось, хотя бы обнаружив пробуждение?

Фактическая проблема заключается в том, что в конкретном приложении ряд операций с базой данных MySQL выполняется в фоновом режиме. При тестировании на компьютере с Windows эти транзакции базы данных прерываются после цикла сна / пробуждения, что вызывает массу ошибок в программе. Эти ошибки обычно выглядят примерно так:

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

Если бы мы могли отреагировать на событие «скоро будет спать», мы могли бы попытаться приостановить фоновые операции, предупреждающие проблему. В идеале, если бы мы могли реагировать на событие «только что проснулся», мы могли бы по крайней мере подавить сообщения об ошибках.

Ответы [ 3 ]

8 голосов
/ 31 июля 2009

Вы можете обнаружить пробуждение, периодически сравнивая текущее системное время с предыдущим системным временем.

Редактировать: вот пример, который, похоже, поможет вам определить, когда машина будет спать: http://www.codeguru.com/cpp/w-p/system/messagehandling/article.php/c6907

3 голосов
/ 31 июля 2009

Я знаю, что это не совсем то, что вы ищете, но, возможно, правильный ответ - попытаться написать код с предположением, что ваши сокеты не обязательно будут работать. Существует множество причин, по которым может произойти сбой соединения, например, из-за того, что БД отключена из-за технического обслуживания, или из-за того, что кто-то отключил ваш кабель Ethernet. Я думаю, у вас возникнут аналогичные проблемы с ошибками, если кто-то выдернет сетевой кабель во время работы вашего приложения, и это не неслыханные условия, так что, возможно, это лучший подход, чтобы попытаться корректно справиться с этими условиями.

2 голосов
/ 31 июля 2009

Вы можете просто JNI или JNA перехватывать события сна / пробуждения из ОС.

Из Windows Power Events (MSDN) вам потребуется создать обработчик окна и нулевое окно для получения событий WM_POWERBROADCAST. Эта оконная процедура может затем вызвать функцию события в вашем Java-коде, чтобы всплыть сообщение.

...