11
votes

Détecter les événements de sommeil du système d'exploitation et de réveil en Java

Y a-t-il un moyen pour un programme Java de détecter lorsque le système d'exploitation est sur le point d'aller au sommeil ou de défaut, ce qui détecte au moins un réveil?

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

si nous pouvions réagir à un événement "dormir bientôt", nous pourrions essayer de mettre en pause les opérations de fond préemptant le problème. Moins Idéalement, si nous pouvions réagir à un événement "juste réveillé", nous pourrions au moins supprimer les messages d'erreur.


0 commentaires

3 Réponses :


10
votes

Vous pouvez détecter le réveil en comparant périodiquement la durée du système actuel à l'heure du système précédent.

Edit: Voici un exemple qui semble que cela vous aiderait à détecter lorsque la machine va dormir: http://www.codeguru.com/cpp/wp/system /MessageHandling/article.php/c6907


2 commentaires

Dommage qu'il ne puisse pas être fait sans Jni, mais le lien ressemble à un bon départ.


Oui, JNI peut être une douleur à développer et à déboguer. Nous avons trouvé que la clé est de garder autant que possible la logique dans Java et d'utiliser JNI comme pont pour effectuer des appels de bas niveau vers l'API C.



3
votes

Je sais que ce n'est pas exactement ce que vous recherchez, mais peut-être que la bonne réponse est d'essayer d'écrire le code avec l'hypothèse que vos sockets ne resteront pas nécessairement en place. Il y a beaucoup de raisons pour lesquelles la connexion pourrait s'écraser, par exemple parce que la DB est retirée pour la maintenance, ou parce que quelqu'un a trébuché sur votre câble Ethernet. Je pense que vous auriez des problèmes similaires avec des erreurs si quelqu'un a tiré le câble réseau pendant que votre application était en cours d'exécution et que ce ne sont pas inoubliables de conditions, c'est peut-être une meilleure approche pour essayer de gérer ces conditions gracieusement.


3 commentaires

Si la base de données se bloque ou que quelqu'un tire un câble, je pense que les messages d'erreur seraient réellement en ordre!


Pas si la demande était recouvrable. Parfois, ils sont, parfois ils ne sont pas. Parfois, il est transitoire, de sorte que l'utilisateur n'envoie jamais, mais le système lui-même fait. Vous devriez être capable de gérer cet événement.


J'ai utilisé C3PO pour faire exactement cela, sa capacité à valider les connexions avant de les renvoyer à l'application de la piscine.