Module java.management.rmi
Package javax.management.remote.rmi

## Class RMIServerImpl

- java.lang.Object
- - javax.management.remote.rmi.RMIServerImpl

All Implemented Interfaces:
  `Closeable`, `AutoCloseable`, `Remote`, `RMIServer`

Direct Known Subclasses:
  `RMIIIOPServerImpl`, `RMIJRMPServerImpl`

    public abstract class RMIServerImpl
    extends Object
    implements Closeable, RMIServer

An RMI object representing a connector server. Remote clients can make connections using the `newClient(Object)` method. This method returns an RMI object representing the connection.

User code does not usually reference this class directly. RMI connection servers are usually created with the class `RMIConnectorServer`. Remote clients usually create connections either with `JMXConnectorFactory` or by instantiating `RMIConnector`.

This is an abstract class. Concrete subclasses define the details of the client connection objects.

Since:
  1.5

### Constructor Summary

Constructors
`RMIServerImpl​(Map<String,​?> env)` Constructs a new `RMIServerImpl`.

### Method Summary

All Methods Instance Methods Abstract Methods Concrete Methods
`protected void` `clientClosed​(RMIConnection client)` Method called when a client connection created by `makeClient` is closed.
`void` `close()` Closes this connection server.
`protected abstract void` `closeClient​(RMIConnection client)` Closes a client connection made by `makeClient`.
`protected abstract void` `closeServer()` Called by `close()` to close the connector server.
`protected abstract void` `export()` Exports this RMI object.
`ClassLoader` `getDefaultClassLoader()` Gets the default `ClassLoader` used by this connector server.
`MBeanServer` `getMBeanServer()` The `MBeanServer` to which this connector server is attached.
`protected abstract String` `getProtocol()` Returns the protocol string for this object.
`protected abstract RMIConnection` `makeClient​(String connectionId, Subject subject)` Creates a new client connection.
`RMIConnection` `newClient​(Object credentials)` Creates a new client connection.
`void` `setDefaultClassLoader​(ClassLoader cl)` Sets the default `ClassLoader` for this connector server.
`void` `setMBeanServer​(MBeanServer mbs)` Sets the `MBeanServer` to which this connector server is attached.
`abstract Remote` `toStub()` Returns a remotable stub for this server object.

### Methods declared in class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Methods declared in interface javax.management.remote.rmi.RMIServer

`getVersion`

### Constructor Detail

#### RMIServerImpl

    public RMIServerImpl​(Map<String,​?> env)

Constructs a new `RMIServerImpl`.

Parameters:
  `env` - the environment containing attributes for the new `RMIServerImpl`. Can be null, which is equivalent to an empty Map.

### Method Detail

#### export

    protected abstract void export()
                            throws IOException

Exports this RMI object.

Throws:
  `IOException` - if this RMI object cannot be exported.

#### toStub

    public abstract Remote toStub()
                           throws IOException

Returns a remotable stub for this server object.

Returns:
  a remotable stub.
Throws:
  `IOException` - if the stub cannot be obtained - e.g the RMIServerImpl has not been exported yet.

#### setDefaultClassLoader

    public void setDefaultClassLoader​(ClassLoader cl)

Sets the default `ClassLoader` for this connector server. New client connections will use this classloader. Existing client connections are unaffected.

Parameters:
  `cl` - the new `ClassLoader` to be used by this connector server.
See Also:
  `getDefaultClassLoader()`

#### getDefaultClassLoader

    public ClassLoader getDefaultClassLoader()

Gets the default `ClassLoader` used by this connector server.

Returns:
  the default `ClassLoader` used by this connector server.
See Also:
  `setDefaultClassLoader(java.lang.ClassLoader)`

#### setMBeanServer

    public void setMBeanServer​(MBeanServer mbs)

Sets the `MBeanServer` to which this connector server is attached. New client connections will interact with this `MBeanServer`. Existing client connections are unaffected.

Parameters:
  `mbs` - the new `MBeanServer`. Can be null, but new client connections will be refused as long as it is.
See Also:
  `getMBeanServer()`

#### getMBeanServer

    public MBeanServer getMBeanServer()

The `MBeanServer` to which this connector server is attached. This is the last value passed to `setMBeanServer(javax.management.MBeanServer)` on this object, or null if that method has never been called.

Returns:
  the `MBeanServer` to which this connector is attached.
See Also:
  `setMBeanServer(javax.management.MBeanServer)`

#### newClient

    public RMIConnection newClient​(Object credentials)
                            throws IOException

Creates a new client connection. This method calls `makeClient` and adds the returned client connection object to an internal list. When this `RMIServerImpl` is shut down via its `close()` method, the `close()` method of each object remaining in the list is called.

The fact that a client connection object is in this internal list does not prevent it from being garbage collected.

Specified by:
  `newClient` in interface `RMIServer`
Parameters:
  `credentials` - this object specifies the user-defined credentials to be passed in to the server in order to authenticate the caller before creating the `RMIConnection`. Can be null.
Returns:
  the newly-created `RMIConnection`. This is usually the object created by `makeClient`, though an implementation may choose to wrap that object in another object implementing `RMIConnection`.
Throws:
  `IOException` - if the new client object cannot be created or exported.
  `SecurityException` - if the given credentials do not allow the server to authenticate the user successfully.
  `IllegalStateException` - if `getMBeanServer()` is null.

#### makeClient

    protected abstract RMIConnection makeClient​(String connectionId,
                                                Subject subject)
                                         throws IOException

Creates a new client connection. This method is called by the public method `newClient(Object)`.

Parameters:
  `connectionId` - the ID of the new connection. Every connection opened by this connector server will have a different ID. The behavior is unspecified if this parameter is null.
  `subject` - the authenticated subject. Can be null.
Returns:
  the newly-created `RMIConnection`.
Throws:
  `IOException` - if the new client object cannot be created or exported.

#### closeClient

    protected abstract void closeClient​(RMIConnection client)
                                 throws IOException

Closes a client connection made by `makeClient`.

Parameters:
  `client` - a connection previously returned by `makeClient` on which the `closeClient` method has not previously been called. The behavior is unspecified if these conditions are violated, including the case where `client` is null.
Throws:
  `IOException` - if the client connection cannot be closed.

#### getProtocol

    protected abstract String getProtocol()

Returns the protocol string for this object. The string is `rmi` for RMI/JRMP.

Returns:
  the protocol string for this object.

#### clientClosed

    protected void clientClosed​(RMIConnection client)
                         throws IOException

Method called when a client connection created by `makeClient` is closed. A subclass that defines `makeClient` must arrange for this method to be called when the resultant object's `close` method is called. This enables it to be removed from the `RMIServerImpl`'s list of connections. It is not an error for `client` not to be in that list.

After removing `client` from the list of connections, this method calls `closeClient(client)`.

Parameters:
  `client` - the client connection that has been closed.
Throws:
  `IOException` - if `closeClient(javax.management.remote.rmi.RMIConnection)` throws this exception.
  `NullPointerException` - if `client` is null.

#### close

    public void close()
               throws IOException

Closes this connection server. This method first calls the `closeServer()` method so that no new client connections will be accepted. Then, for each remaining `RMIConnection` object returned by `makeClient`, its `close` method is called.

The behavior when this method is called more than once is unspecified.

If `closeServer()` throws an `IOException`, the individual connections are nevertheless closed, and then the `IOException` is thrown from this method.

If `closeServer()` returns normally but one or more of the individual connections throws an `IOException`, then, after closing all the connections, one of those `IOException`s is thrown from this method. If more than one connection throws an `IOException`, it is unspecified which one is thrown from this method.

Specified by:
  `close` in interface `AutoCloseable`
Specified by:
  `close` in interface `Closeable`
Throws:
  `IOException` - if `closeServer()` or one of the `RMIConnection.close()` calls threw `IOException`.

#### closeServer

    protected abstract void closeServer()
                                 throws IOException

Called by `close()` to close the connector server. After returning from this method, the connector server must not accept any new connections.

Throws:
  `IOException` - if the attempt to close the connector server failed.