Il est possible de lancer le RMIRegistry automatiquement et directement depuis une application en utilisant la classe utilitaire ci-dessous. Pour l'utiliser vous devez simplement faire :
RegistryHelper registryHelper = new RegistryHelper(); registryHelper.initializeRegistry();dans le code de votre serveur.
La classe RegistryHelper est celle donnee ci-dessous. Il suffit de l'ajouter dans directement dans vos sources.
public class RegistryHelper { protected final static int DEFAULT_REGISTRY_PORT = 1099; /** * settings of the registry */ protected int registryPortNumber = DEFAULT_REGISTRY_PORT; protected boolean shouldCreateRegistry = true; protected boolean registryChecked; // // -- Constructors ----------------------------------------------- // public RegistryHelper() { } // // -- PUBLIC METHODS ----------------------------------------------- // public int getRegistryPortNumber() { return registryPortNumber; } public void setRegistryPortNumber(int v) { registryPortNumber = v; registryChecked = false; } public boolean shouldCreateRegistry() { return shouldCreateRegistry; } public void setShouldCreateRegistry(boolean v) { shouldCreateRegistry = v; } public synchronized void initializeRegistry() throws java.rmi.RemoteException { if (! shouldCreateRegistry) return; // don't bother if (registryChecked) return; // already done for this VM getOrCreateRegistry(registryPortNumber); registryChecked = true; } // // -- PRIVATE METHODS ----------------------------------------------- // private static java.rmi.registry.Registry createRegistry(int port) throws java.rmi.RemoteException { return java.rmi.registry.LocateRegistry.createRegistry(port); } private static java.rmi.registry.Registry detectRegistry(int port) { java.rmi.registry.Registry registry = null; try { // whether an effective registry exists or not we should get a reference registry = java.rmi.registry.LocateRegistry.getRegistry(port); if (registry == null) return null; // doing a lookup should produce ConnectException if registry doesn't exist // and no exception or NotBoundException if the registry does exist. java.rmi.Remote r = registry.lookup("blah!"); System.out.println("Detected an existing RMI Registry on port "+port); return registry; } catch (java.rmi.NotBoundException e) { System.out.println("Detected an existing RMI Registry on port "+port); return registry; } catch (java.rmi.RemoteException e) { return null; } } private static java.rmi.registry.Registry getOrCreateRegistry(int port) throws java.rmi.RemoteException { java.rmi.registry.Registry registry = detectRegistry(port); if (registry != null) return registry; // no registry created try { registry = createRegistry(port); System.out.println("Created a new registry on port "+port); return registry; } catch (java.rmi.RemoteException e) { // problem to bind the registry : may be somebody created one in the meantime // try to find the rmi registry one more time registry = detectRegistry(port); if (registry != null) return registry; System.out.println("Cannot detect an existing RMI Registry on port "+port+" nor create one e="+e); throw e; } } }