2009-07-31 10 views
6

¿Hay alguna manera de que un programa Java detecte cuándo el sistema operativo está a punto de quedarse dormido, o al menos detectar un despertador?Detectar eventos de suspensión y activación de SO en Java

El problema real es que en una aplicación en particular se ejecutan varias operaciones de base de datos MySQL en segundo plano. Al probar en una máquina con Windows, estas transacciones de base de datos se interrumpen después de un ciclo de suspensión/activación que causa una tonelada de condiciones de error en el programa. Estos errores suelen ser algo como esto:

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

Si pudiéramos reaccionar a un evento 'va a dormir pronto' podríamos intentar hacer una pausa en operaciones en segundo plano adelantarse al problema. Menos idealmente si pudiéramos reaccionar a un evento 'recién despertado' podríamos al menos suprimir los mensajes de error.

Respuesta

7

Puede detectar la activación comparando periódicamente la hora actual del sistema con la hora anterior del sistema.

Editar: he aquí un ejemplo que parece que ayudaría a detectar cuando la máquina se va a dormir: http://www.codeguru.com/cpp/w-p/system/messagehandling/article.php/c6907

+0

Lástima que no se puede hacer sin JNI, pero el enlace parece un buen comienzo. –

+0

Sí, JNI puede ser un problema para desarrollar y depurar. Hemos descubierto que la clave es mantener la mayor lógica posible en Java, y simplemente usar JNI como puente para realizar llamadas de bajo nivel a la API de C. – rob

2

Yo sé que no es exactamente lo que estás buscando, pero tal vez la respuesta correcta es intente escribir el código con la suposición de que sus enchufes no permanecerán necesariamente elevados. Hay muchas razones por las cuales la conexión podría fallar, por ejemplo porque el DB se retira para mantenimiento o porque alguien se desconectó de su cable Ethernet. Creo que tendrás problemas similares con los errores si alguien sacó el cable de red mientras tu aplicación se estaba ejecutando, y estas no son condiciones desconocidas, así que tal vez sea un mejor enfoque para tratar de manejar esas condiciones con gracia.

+0

Si la base de datos se cuelga o alguien tira de un cable, creo que los mensajes de error estarían realmente en orden. –

+0

No si la solicitud fue recuperable. A veces lo son, a veces no lo son. A veces es transitorio, de manera que el usuario nunca lo nota, pero el sistema sí lo hace. Debería poder manejar ese evento. –

+0

Utilicé C3PO para hacer exactamente esto, es capaz de validar conexiones antes de devolverlas a la aplicación desde el grupo. –

2

Puede JNI o ​​JNA atrapar los eventos de suspensión/activación del sistema operativo.

De Windows Power Events (MSDN), tendría que crear un controlador de ventana y una ventana nula para recibir los eventos WM_POWERBROADCAST. Este procedimiento de ventana podría llamar a una función de evento en su código de Java para subir el mensaje.

Cuestiones relacionadas