11

オペレーティングシステムがスリープ状態になろうとしているとき、またはそれが失敗したときに、Java プログラムが少なくともウェイクアップを検出する方法はありますか?

実際の問題は、特定のアプリケーションで多数の MySQL データベース操作がバックグラウンドで実行されることです。Windows マシンでのテストでは、スリープ/ウェイクアップ サイクルの後にこれらのデータベース トランザクションが中断され、プログラムで大量のエラー状態が発生しました。これらのエラーは通常、次のようになります。

java.net.SocketException
メッセージ: ソフトウェアが原因で接続が中止されました: recv に失敗しました

「すぐにスリープする」イベントに対応できれば、問題を先取りしてバックグラウンド操作を一時停止することができます。あまり理想的ではありませんが、「起きたばかり」のイベントに対応できれば、少なくともエラー メッセージを抑制することができます。

4

3 に答える 3

10

現在のシステム時刻を以前のシステム時刻と定期的に比較することで、ウェイクアップを検出できます。

編集: マシンがいつスリープ状態になるかを検出するのに役立つように見える例を次に示します: http://www.codeguru.com/cpp/wp/system/messagehandling/article.php/c6907

于 2009-07-31T15:55:46.643 に答える
3

JNIまたはJNAだけで、OSからのスリープ/ウェイクアップイベントをトラップできます。

Windows Power Events(MSDN)から、WM_POWERBROADCASTイベントを受信するためにウィンドウハンドラーとヌルウィンドウを作成する必要があります。このウィンドウプロシージャは、Javaコードでイベント関数を呼び出して、メッセージをバブルアップすることができます。

于 2009-07-31T18:15:52.570 に答える
3

まさにあなたが探しているものではないことはわかっていますが、正しい答えは、ソケットが必ずしも稼働しているとは限らないという前提でコードを記述しようとすることです。接続がクラッシュする理由はたくさんあります。たとえば、DB がメンテナンスのために停止したり、誰かがイーサネット ケーブルにつまずいたりしたためです。アプリの実行中に誰かがネットワークケーブルを抜いた場合、同様のエラーの問題が発生すると思いますが、これらは前代未聞の状態ではないため、これらの状態を適切に処理するためのより良いアプローチかもしれません.

于 2009-07-31T16:20:51.260 に答える