Mini-Projet FAQ - 01

Creer le RMIRegistry directement dans votre application

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;
    }
  }  

}