2012-01-20 18 views
5

sto utilizzando l'API Java Attach per connettersi alle JVM locali. sto facendo qualcosa di simile al seguentejava VirtualMachine.getSystemProperties() deadlock

VirtualMachine vm = VirtualMachine.attach("8400"); 
Properties props = vm.getSystemProperties(); 

in esecuzione su una macchina Windows, se la macchina virtuale che sto collegandomi ad arresto è tra il fissare e le chiamate getSystemProperties, getSystemProperties() bloccherà per sempre e creare una situazione di stallo in questo thread. Ho rintracciato il blocco fino a WindowsVirtualMachine.connectPipe(). è un metodo nativo, quindi nella funzione connectPipe di WindowsVirtualMachine.c c'è una chiamata a ConnectNamedPipe. Ho visto alcuni post sul deadlocking di ConnectNamedPipe su macchine Windows. ho provato a interrompere il thread che è bloccato, ma questo non sblocca il thread.

Non sono del tutto sicuro di quale sia la soluzione alternativa, ma non prenderei in considerazione l'API Attach (anche se preferisco attenermi alla mia attuale soluzione). sto usando l'API Attach per usare VirtualMachine.list() per far funzionare le JVM sul computer locale. e poi da lì lo sto usando per ottenere le proprietà di sistema e collegarmi a loro tramite JMX. so che probabilmente potrei creare una soluzione personalizzata usando una libreria per comunicare tra i processi attraverso la rete, ma preferirei usare la comunicazione a livello di OS tra i processi, che è quello che credo che l'API Allegra stia usando.

quindi la mia domanda è ci sono soluzioni alternative per il mio problema? o ci sono librerie che potrebbero darmi la stessa funzionalità di VirtualMachine.list()?

+0

Cosa intendi per interruzione del thread non funziona? non fa nulla? – Adrian

+0

interrompendo il thread che è bloccato non lo sblocca. – mikey

+1

Prova anche a fermare() il thread (che BTW è una cattiva idea, ma guarda come si comporta). Ecco il doc per interrupt: http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html#interrupt%28%29 – Adrian

risposta

0

cosa vorresti che accadesse in questo caso? Una soluzione comune per un problema come questo è di avere un thread watcher che aspetta che il thread finisca un'attività e quindi se non lo finisce in un certo lasso di tempo presume che ci sia un deadlock ed esca dal processo. Ovviamente questo è abbastanza pesante ma non c'è molto altro che potresti fare in questo caso che sarebbe "corretto".