RMI server: rmiregistry or LocateRegistry.createRegistry

前端 未结 4 1519
灰色年华
灰色年华 2021-02-05 15:29

For RMI on server-side, do we need to start rmiregistry program, or just call LocateRegistry.createRegistry? If both are possible, what are the advant

4条回答
  •  醉梦人生
    2021-02-05 16:22

    If we start rmiregistry first, RmiServiceExporter would register itself to the running rmiregistry. In this case, we have to set the system property 'java.rmi.server.codebase' to where the 'org.springframework.remoting.rmi.RmiInvocationWrapper_Stub' class can be found. Otherwise, the RmiServiceExporter would not be started and got the exception " ClassNotFoundException class not found: org.springframework.remoting.rmi.RmiInvocationWrapper_Stub; nested exception is: ..."

    If your rmi server, rmi client and rmiregistry can access the same filesystem, you may want the system property to be automatically configured to where the spring.jar can be found on the shared filesystem. The following utility classes and spring configuration show how this can be achieved.

    abstract public class CodeBaseResolver { 
      static public String resolveCodeBaseForClass(Class clazz) {
        Assert.notNull(clazz);
        final CodeSource codeSource = clazz.getProtectionDomain().getCodeSource();
        if (codeSource != null) {
          return codeSource.getLocation().toString();
        } else {
          return "";
        }
      }
    }
    
    public class SystemPropertyConfigurer {
      private Map systemProperties;
      public void setSystemProperties(Map systemProperties) {
        this.systemProperties = systemProperties;
      }
    
      @PostConstruct
      void init() throws BeansException {
        if (systemProperties == null || systemProperties.isEmpty()) {
          return;
        }
        for (Map.Entry entry : systemProperties.entrySet()) {
          final String key = entry.getKey();
          final String value = SystemPropertyUtils.resolvePlaceholders(entry.getValue());
          System.setProperty(key, value);
        }
      }
    }
    
    
    
      
      
        
          org.springframework.remoting.rmi.RmiInvocationWrapper_Stub
        
      
    
    
    
      
        
          
        
      
    
    
    
      
      
      
      
    
    

    The above example shows how system property be set automatically only when rmi server, rmi client and rmi registry can access the same filesystem. If that is not true or spring codebase is shared via other method (e.g. HTTP), you may modify the CodeBaseResolver to fit your need.

提交回复
热议问题