2009-07-31 4 views
6

Un programme Java peut-il détecter le moment où le système d'exploitation est sur le point de s'endormir ou, à défaut, détecter au moins un réveil?Détecter les événements Sleep et Wake Up du système d'exploitation en Java

Le problème réel est que dans une application particulière, un certain nombre d'opérations de base de données MySQL sont exécutées en arrière-plan. Lors d'un test sur une machine Windows, ces transactions de base de données sont interrompues après un cycle de veille/de réveil provoquant une tonne de conditions d'erreur dans le programme. Ces erreurs recherchent généralement quelque chose comme ceci:

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

Si nous pouvions réagir à un événement « dormira bientôt », nous pourrions essayer de faire une pause des opérations d'arrière-plan le problème préemption. Moins idéalement, si nous pouvions réagir à un événement «juste réveillé», nous pourrions au moins supprimer les messages d'erreur.

Répondre

7

Vous pouvez détecter le réveil en comparant périodiquement l'heure système actuelle à l'heure système précédente.

Edit: voici un exemple qui ressemble à cela vous aider à détecter quand la machine va dormir: http://www.codeguru.com/cpp/w-p/system/messagehandling/article.php/c6907

+0

Dommage qu'il ne puisse pas être fait sans JNI mais le lien semble être un bon début. –

+0

Oui, JNI peut être une douleur à développer et déboguer. Nous avons trouvé que la clé est de conserver autant de logique que possible en Java, et d'utiliser simplement JNI comme un pont pour faire des appels de bas niveau à l'API C. – rob

2

Je sais que ce n'est pas exactement ce que vous cherchez, mais peut-être la bonne réponse est de essayez d'écrire le code en supposant que vos prises ne resteront pas nécessairement en place. Il y a de nombreuses raisons pour lesquelles la connexion risque de planter, par exemple parce que la base de données est supprimée pour maintenance ou parce que quelqu'un a trébuché sur votre câble Ethernet. Je pense que vous auriez des problèmes similaires avec les erreurs si quelqu'un retirait le câble réseau pendant que votre application fonctionnait, et ce ne sont pas des conditions inédites, alors peut-être que c'est une meilleure approche pour essayer de gérer ces conditions avec élégance.

+0

Si la base de données tombe en panne ou que quelqu'un tire un câble, je pense que les messages d'erreur seraient en ordre! –

+0

Pas si la requête était récupérable. Parfois ils le sont, parfois ils ne le sont pas. Parfois, il est transitoire, de sorte que l'utilisateur ne le remarque jamais, mais le système lui-même le fait. Vous devriez être capable de gérer cet événement. –

+0

J'ai utilisé C3PO pour faire exactement cela, c'est capable de valider les connexions avant de les renvoyer l'application de la piscine. –

2

Vous pouvez simplement JNI ou JNA pour intercepter les événements sleep/wakeup du système d'exploitation.

De Windows Power Events (MSDN), vous devez créer un gestionnaire de fenêtres et une fenêtre null pour recevoir les événements WM_POWERBROADCAST. Cette procédure de fenêtre pourrait alors appeler une fonction d'événement dans votre code Java pour faire passer le message.

Questions connexes