2009-07-31 2 views
6

C'è un modo per un programma Java di rilevare quando il sistema operativo sta per andare a dormire o, in caso contrario, di rilevare almeno una sveglia?Rileva eventi di sospensione e riattivazione del sistema operativo in Java

Il problema reale è che in una particolare applicazione vengono eseguite in background numerose operazioni del database MySQL. Durante il test su una macchina Windows queste transazioni del database vengono interrotte dopo un ciclo di sospensione/riattivazione che causa un sacco di condizioni di errore nel programma. Questi errori di solito sono qualcosa del tipo:

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

Se potessimo reagire a un evento 'presto dormirà' potremmo tentare di mettere in pausa le operazioni in background preempting il problema. Meno idealmente se potessimo reagire a un evento "appena svegliato" potremmo almeno sopprimere i messaggi di errore.

risposta

7

È possibile rilevare il risveglio confrontando periodicamente l'ora del sistema corrente con l'ora di sistema precedente.

Edit: ecco un esempio che sembra che sarebbe aiutare a rilevare quando la macchina sta andando a dormire: http://www.codeguru.com/cpp/w-p/system/messagehandling/article.php/c6907

+0

Peccato che non si possa fare senza JNI ma il collegamento sembra un buon inizio. –

+0

Sì, JNI può essere un problema per lo sviluppo e il debug. Abbiamo trovato la chiave per mantenere il più possibile la logica in Java e utilizzare JNI come bridge per effettuare chiamate di basso livello all'API C. – rob

2

io so che non è esattamente quello che stai cercando, ma forse la risposta giusta è quella di prova a scrivere il codice con l'ipotesi che le tue prese non rimarranno necessariamente. Esistono molte ragioni per cui la connessione potrebbe bloccarsi, ad esempio perché il DB viene rimosso per manutenzione o perché qualcuno è inciampato nel cavo Ethernet. Penso che avresti problemi simili con gli errori se qualcuno estraesse il cavo di rete mentre la tua app era in esecuzione, e queste non sono condizioni inaudite, quindi forse è un approccio migliore per cercare di gestire queste condizioni con garbo.

+0

Se il database si blocca o qualcuno tira un cavo, penso che i messaggi di errore siano effettivamente in ordine! –

+0

Non se la richiesta è stata recuperata. A volte lo sono, a volte non lo sono. A volte è transitorio, tale che l'utente non si accorge mai, ma lo fa il sistema stesso. Dovresti essere in grado di gestire quell'evento. –

+0

Ho usato C3PO per fare esattamente questo, è in grado di convalidare le connessioni prima di restituirle l'app dal pool. –

2

È possibile solo JNI o ​​JNA per intercettare gli eventi di sospensione/attivazione dal sistema operativo.

Da Windows Power Events (MSDN), è necessario creare un gestore di finestre e una finestra nulla per ricevere gli eventi WM_POWERBROADCAST. Questa procedura di finestra potrebbe quindi chiamare una funzione di evento nel codice Java per far comparire il messaggio.