JavaでのOSスリープおよびウェイクアップイベントの検出
-
06-07-2019 - |
質問
オペレーティングシステムがスリープ状態に移行しようとしていることをJavaプログラムが検出する方法はありますか?
実際の問題は、特定のアプリケーションで多くのMySQLデータベース操作がバックグラウンドで実行されることです。 Windowsマシンでのテストでは、スリープ/ウェイクアップサイクルの後にこれらのデータベーストランザクションが中断され、プログラムに大量のエラー状態が発生します。通常、これらのエラーは次のようになります。
java.net.SocketException MESSAGE: Software caused connection abort: recv failed
「すぐにスリープする」イベントに対応できる場合、バックグラウンド操作を一時停止して問題を先取りすることができます。理想的ではありませんが、「目覚めたばかり」のイベントに対応できれば、少なくともエラーメッセージを抑制できます。
解決
定期的に現在のシステム時刻を以前のシステム時刻と比較することで、ウェイクアップを検出できます。
編集:これは、マシンがスリープ状態になるタイミングを検出するのに役立つように見える例です。 http://www.codeguru.com/cpp/wp/system /messagehandling/article.php/c6907
他のヒント
それはあなたが探しているものではないことはわかっていますが、おそらく正しい答えは、ソケットが必ずしも稼働し続けるとは限らないという前提でコードを書くことです。接続がクラッシュする理由はたくさんあります。たとえば、DBがメンテナンスのためにダウンしたり、誰かがイーサネットケーブルでつまずいたためです。アプリの実行中に誰かがネットワークケーブルを抜いた場合、同様のエラーが発生すると思いますが、これらは前代未聞の条件ではないため、これらの条件を適切に処理する方が良い方法です。
JNIまたはJNAだけで、OSからのスリープ/ウェイクアップイベントをトラップできます。
Windows Power Events(MSDN)、WM_POWERBROADCASTイベントを受信するには、ウィンドウハンドラーとnullウィンドウを作成する必要があります。このウィンドウプロシージャは、Javaコードでイベント関数を呼び出してメッセージをバブルします。