org.springframework.remoting.rmi

Class RmiServiceExporter

  • All Implemented Interfaces:
    Aware, BeanClassLoaderAware, DisposableBean, InitializingBean


    public class RmiServiceExporter
    extends RmiBasedExporter
    implements InitializingBean, DisposableBean
    RMI exporter that exposes the specified service as RMI object with the specified name. Such services can be accessed via plain RMI or via RmiProxyFactoryBean. Also supports exposing any non-RMI service via RMI invokers, to be accessed via RmiClientInterceptor / RmiProxyFactoryBean's automatic detection of such invokers.

    With an RMI invoker, RMI communication works on the RmiInvocationHandler level, needing only one stub for any service. Service interfaces do not have to extend java.rmi.Remote or throw java.rmi.RemoteException on all methods, but in and out parameters have to be serializable.

    The major advantage of RMI, compared to Hessian, is serialization. Effectively, any serializable Java object can be transported without hassle. Hessian has its own (de-)serialization mechanisms, but is HTTP-based and thus much easier to setup than RMI. Alternatively, consider Spring's HTTP invoker to combine Java serialization with HTTP-based transport.

    Note: RMI makes a best-effort attempt to obtain the fully qualified host name. If one cannot be determined, it will fall back and use the IP address. Depending on your network configuration, in some cases it will resolve the IP to the loopback address. To ensure that RMI will use the host name bound to the correct network interface, you should pass the java.rmi.server.hostname property to the JVM that will export the registry and/or the service using the "-D" JVM argument. For example: -Djava.rmi.server.hostname=myserver.com

    Since:
    13.05.2003
    Author:
    Juergen Hoeller
    See Also:
    RmiClientInterceptor, RmiProxyFactoryBean, Remote, RemoteException, HessianServiceExporter, HttpInvokerServiceExporter
    • Constructor Detail

      • RmiServiceExporter

        public RmiServiceExporter()
    • Method Detail

      • setServiceName

        public void setServiceName(java.lang.String serviceName)
        Set the name of the exported RMI service, i.e. rmi://host:port/NAME
      • setServicePort

        public void setServicePort(int servicePort)
        Set the port that the exported RMI service will use.

        Default is 0 (anonymous port).

      • setClientSocketFactory

        public void setClientSocketFactory(java.rmi.server.RMIClientSocketFactory clientSocketFactory)
        Set a custom RMI client socket factory to use for exporting the service.

        If the given object also implements java.rmi.server.RMIServerSocketFactory, it will automatically be registered as server socket factory too.

        See Also:
        setServerSocketFactory(java.rmi.server.RMIServerSocketFactory), RMIClientSocketFactory, RMIServerSocketFactory, UnicastRemoteObject.exportObject(Remote, int, RMIClientSocketFactory, RMIServerSocketFactory)
      • setServerSocketFactory

        public void setServerSocketFactory(java.rmi.server.RMIServerSocketFactory serverSocketFactory)
        Set a custom RMI server socket factory to use for exporting the service.

        Only needs to be specified when the client socket factory does not implement java.rmi.server.RMIServerSocketFactory already.

        See Also:
        setClientSocketFactory(java.rmi.server.RMIClientSocketFactory), RMIClientSocketFactory, RMIServerSocketFactory, UnicastRemoteObject.exportObject(Remote, int, RMIClientSocketFactory, RMIServerSocketFactory)
      • setRegistryHost

        public void setRegistryHost(java.lang.String registryHost)
        Set the host of the registry for the exported RMI service, i.e. rmi://HOST:port/name

        Default is localhost.

      • setRegistryPort

        public void setRegistryPort(int registryPort)
        Set the port of the registry for the exported RMI service, i.e. rmi://host:PORT/name

        Default is Registry.REGISTRY_PORT (1099).

        See Also:
        Registry.REGISTRY_PORT
      • setRegistryClientSocketFactory

        public void setRegistryClientSocketFactory(java.rmi.server.RMIClientSocketFactory registryClientSocketFactory)
        Set a custom RMI client socket factory to use for the RMI registry.

        If the given object also implements java.rmi.server.RMIServerSocketFactory, it will automatically be registered as server socket factory too.

        See Also:
        setRegistryServerSocketFactory(java.rmi.server.RMIServerSocketFactory), RMIClientSocketFactory, RMIServerSocketFactory, LocateRegistry.getRegistry(String, int, RMIClientSocketFactory)
      • setRegistryServerSocketFactory

        public void setRegistryServerSocketFactory(java.rmi.server.RMIServerSocketFactory registryServerSocketFactory)
        Set a custom RMI server socket factory to use for the RMI registry.

        Only needs to be specified when the client socket factory does not implement java.rmi.server.RMIServerSocketFactory already.

        See Also:
        setRegistryClientSocketFactory(java.rmi.server.RMIClientSocketFactory), RMIClientSocketFactory, RMIServerSocketFactory, LocateRegistry.createRegistry(int, RMIClientSocketFactory, RMIServerSocketFactory)
      • setAlwaysCreateRegistry

        public void setAlwaysCreateRegistry(boolean alwaysCreateRegistry)
        Set whether to always create the registry in-process, not attempting to locate an existing registry at the specified port.

        Default is "false". Switch this flag to "true" in order to avoid the overhead of locating an existing registry when you always intend to create a new registry in any case.

      • setReplaceExistingBinding

        public void setReplaceExistingBinding(boolean replaceExistingBinding)
        Set whether to replace an existing binding in the RMI registry, that is, whether to simply override an existing binding with the specified service in case of a naming conflict in the registry.

        Default is "true", assuming that an existing binding for this exporter's service name is an accidental leftover from a previous execution. Switch this to "false" to make the exporter fail in such a scenario, indicating that there was already an RMI object bound.

      • afterPropertiesSet

        public void afterPropertiesSet()
                                throws java.rmi.RemoteException
        Description copied from interface: InitializingBean
        Invoked by the containing BeanFactory after it has set all bean properties and satisfied BeanFactoryAware, ApplicationContextAware etc.

        This method allows the bean instance to perform validation of its overall configuration and final initialization when all bean properties have been set.

        Specified by:
        afterPropertiesSet in interface InitializingBean
        Throws:
        java.rmi.RemoteException
      • prepare

        public void prepare()
                     throws java.rmi.RemoteException
        Initialize this service exporter, registering the service as RMI object.

        Creates an RMI registry on the specified port if none exists.

        Throws:
        java.rmi.RemoteException - if service registration failed
      • getRegistry

        protected java.rmi.registry.Registry getRegistry(java.lang.String registryHost,
                                                         int registryPort,
                                                         @Nullable
                                                         java.rmi.server.RMIClientSocketFactory clientSocketFactory,
                                                         @Nullable
                                                         java.rmi.server.RMIServerSocketFactory serverSocketFactory)
                                                  throws java.rmi.RemoteException
        Locate or create the RMI registry for this exporter.
        Parameters:
        registryHost - the registry host to use (if this is specified, no implicit creation of a RMI registry will happen)
        registryPort - the registry port to use
        clientSocketFactory - the RMI client socket factory for the registry (if any)
        serverSocketFactory - the RMI server socket factory for the registry (if any)
        Returns:
        the RMI registry
        Throws:
        java.rmi.RemoteException - if the registry couldn't be located or created
      • getRegistry

        protected java.rmi.registry.Registry getRegistry(int registryPort,
                                                         @Nullable
                                                         java.rmi.server.RMIClientSocketFactory clientSocketFactory,
                                                         @Nullable
                                                         java.rmi.server.RMIServerSocketFactory serverSocketFactory)
                                                  throws java.rmi.RemoteException
        Locate or create the RMI registry for this exporter.
        Parameters:
        registryPort - the registry port to use
        clientSocketFactory - the RMI client socket factory for the registry (if any)
        serverSocketFactory - the RMI server socket factory for the registry (if any)
        Returns:
        the RMI registry
        Throws:
        java.rmi.RemoteException - if the registry couldn't be located or created
      • getRegistry

        protected java.rmi.registry.Registry getRegistry(int registryPort)
                                                  throws java.rmi.RemoteException
        Locate or create the RMI registry for this exporter.
        Parameters:
        registryPort - the registry port to use
        Returns:
        the RMI registry
        Throws:
        java.rmi.RemoteException - if the registry couldn't be located or created
      • testRegistry

        protected void testRegistry(java.rmi.registry.Registry registry)
                             throws java.rmi.RemoteException
        Test the given RMI registry, calling some operation on it to check whether it is still active.

        Default implementation calls Registry.list().

        Parameters:
        registry - the RMI registry to test
        Throws:
        java.rmi.RemoteException - if thrown by registry methods
        See Also:
        Registry.list()
      • destroy

        public void destroy()
                     throws java.rmi.RemoteException
        Unbind the RMI service from the registry on bean factory shutdown.
        Specified by:
        destroy in interface DisposableBean
        Throws:
        java.rmi.RemoteException