Para resumir, tengo problemas para cerrar un par de subprocesos no daemon de Java RMI después de que mi aplicación ya no necesite RMI. Esto evita que la JVM salga cuando se completa main().Los subprocesos de RMI impiden que JVM salga después de que main() complete
Entiendo que exportar UnicastRemoteObject
s hará que RMI deje abiertos los hilos hasta que llame con éxito al UnicastRemoteObject.unexportObject(Object o,boolean force)
. He aquí un ejemplo (correr sin modificación y la JVM saldrá normalmente - quitar la llamada a unexportObject y la JVM Nunca salida):
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
public class TestUnicastRemoteObject{
private static UnicastRemoteObject obj;
private static Registry registry;
public static void main(String[] args) throws Exception{
obj = new UnicastRemoteObject(){
private static final long serialVersionUID = 1L;
};
System.err.println("created UnicastRemoteObject");
System.err.println("creating registry ...");
registry = LocateRegistry.createRegistry(9999);
System.err.println("registry created.");
System.err.println("binding obj to registry ...");
registry.bind("Test", obj);
System.err.println("bound");
UnicastRemoteObject.unexportObject(obj, true);
System.err.println("unexported obj");
}
}
Además, no parece importar si se crea el registro y/o vincular el objeto remoto a él: lo único que parece importar en este ejemplo es que cada vez que creas un UnicastRemoteObject, debes llamar al unexportObject
para evitar que se queden hilos después de que hayas terminado.
En mi aplicación, me he asegurado de haber llamado unexportObject en cada UnicastRemoteObject que creo, y aún el subproceso "reaper" de RMI y el subproceso de "conexión aceptada" aún persisten, impidiendo que mi JVM salga cuando mi aplicación terminado de usar los recursos de RMI.
¿Hay algo más que pueda hacer que RMI deje hilos, aparte de olvidarse de UnicastRemoteObjects? lo suficientemente
¿Se supone que ese programa de prueba se cuelga? ¿Qué JRE estás usando? ¿Has probado> = 1.6? ¿Son los "reaper" y "connection-accept" realmente los únicos hilos no-daemon que quedan? – Gray
Sí, esos dos hilos son los únicos que quedan cuando perfilo la aplicación. Se supone que el programa de prueba continuará ejecutándose después de que finalice el proceso principal, cuando usted comente la llamada a 'UnicastRemoteObject.unexportObject (obj, true)'. El comportamiento deseado es que el programa de prueba salga. Sospecho que probablemente me esté perdiendo una llamada a unexportObject en algún lugar, pero era curioso si hay otras formas de dejar en ejecución los hilos RMI. – CodeBlind
Y sí, estoy ejecutando Java 1.6 y 1.7, el comportamiento es el mismo en ambas versiones. – CodeBlind