2012-01-20 12 views
5

estoy usando la API de Java Attach para conectarme a las JVM locales. estoy haciendo algo como lo siguientejava VirtualMachine.getSystemProperties() deadlock

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

se ejecuta en una máquina Windows, si la máquina virtual que estoy conectado está apagado entre la Adjuntar y el getSystemProperties llamadas, getSystemProperties() bloquearán siempre y para crear un punto muerto en ese hilo. he rastreado el bloque hasta el WindowsVirtualMachine.connectPipe(). es un método nativo, por lo que en la función connectPipe de WindowsVirtualMachine.c hay una llamada a ConnectNamedPipe. He visto algunas publicaciones sobre el bloqueo de ConnectNamedPipe en máquinas con Windows. He intentado interrumpir el hilo que está bloqueado, pero eso no desbloquea el hilo.

no estoy seguro de cuál es la solución para esto, pero consideraría no utilizar la API de conexión (aunque prefiero seguir con mi solución actual). Estoy usando la API de conexión para usar VirtualMachine.list() para que las JVM se ejecuten en la máquina local. y desde allí estoy usando eso para obtener propiedades del sistema y conectarme a ellas a través de JMX. Sé que probablemente podría crear una solución personalizada usando una biblioteca para comunicarme entre los procesos a través de la red, pero preferiría usar comunicación de nivel de os entre los procesos, que es lo que creo que usa la API de conexión.

así que mi pregunta es ¿hay alguna solución para mi problema? o ¿hay bibliotecas que puedan darme la misma funcionalidad que VirtualMachine.list()?

+0

¿Qué quiere decir que interrumpir el hilo no funciona? no hace nada? – Adrian

+0

interrumpir el hilo que está bloqueado no lo desbloquea. – mikey

+1

También intente detener() el hilo (lo que por cierto es una mala idea, pero vea cómo se comporta). Aquí está el documento para la interrupción: http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html#interrupt%28%29 – Adrian

Respuesta

0

¿Qué le gustaría que sucediera en este caso? Una solución común para un problema como este es tener un hilo de observador que espera que el hilo termine una tarea y luego, si no termina en un cierto tiempo, suponga que hay un interbloqueo y salga del proceso. Obviamente esto es bastante pesado, pero no hay mucho más que puedas hacer en este caso que sea 'correcto'.

Cuestiones relacionadas