2009-07-31 1 views
6

オペレーティングシステムがスリープ状態になるか、または少なくともスリープ状態になるかを検出する方法はありますか?JavaのOSスリープと起動イベントを検出する

特定のアプリケーションでは、多くのMySQLデータベース操作がバックグラウンドで実行されるという実際の問題です。 Windowsマシン上でのテストでは、これらのデータベーストランザクションはスリープ/ウェイクアップサイクルの後に中断され、プログラムで大量のエラー状態が発生します。我々は問題を先取りバックグラウンド処理を一時停止しようとする可能性があり「すぐに寝ます」イベントに反応する可能性がある場合

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

:これらのエラーは通常、次のようになり。理想的には、「ちょうど起こった」イベントに反応できれば、少なくともエラーメッセージを抑制することができます。

答えて

7

現在のシステム時刻と以前のシステム時刻を定期的に比較して、起床を検出できます。

編集:ここではマシンがスリープ状態に起こっているときに検出するのに役立つだろうように見える例を示します http://www.codeguru.com/cpp/w-p/system/messagehandling/article.php/c6907

+0

JNIなしではできませんがリンクは良いスタートのようです。 –

+0

はい、JNIは開発とデバッグに苦労することがあります。私たちは、Javaで可能な限り多くのロジックを維持し、C APIへの低レベルの呼び出しを行うためのブリッジとしてJNIを使​​用することが鍵であることを発見しました。 – rob

2

私はそれはあなたが探しているまさにではありません知っているが、多分右の答えはでありあなたのソケットが必ずしも起きないという前提でコードを書くようにしてください。 DBがメンテナンスのために停止されたか、または誰かがあなたのイーサネットケーブルでトリップしたためなど、接続がクラッシュする理由はたくさんあります。私はあなたのアプリが実行されている間に誰かがネットワークケーブルを抜いてしまった場合にも、同様の問題を抱えていると思います。これらは予期しないことではないので、これらの条件をうまくやってやる方が良いかもしれません。

+0

データベースがクラッシュしたり、誰かがケーブルを引っ張ったりすると、エラーメッセージが実際には順番に来ると思います! –

+0

要求が回復可能であれば、そうではありません。時には彼らは時々、時々彼らはそうではありません。ユーザーが気付かないような一時的なものもありますが、システムそのものは時には過渡的です。そのイベントを処理できるはずです。 –

+0

私はC3POを使ってこれを正確に実行し、プールからアプリを返す前に接続を検証できます。 –

2

OSからのスリープ/ウェイクアップイベントをトラップするためにJNIまたはJNAのみができます。

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

関連する問題