RMI and JMX plants

I am trying to start the embedded JMX server in my java application. I want to use the same port for the RMI registry and for real RMI traffic (or JMX traffic, if you want). This is apparently possible, since the RMI Registry is just the remote object itself .

An additional complication is that I need to use Socket Factory, because I need to bind to a specific network adapter. I start with:

int registryPort = 3012;
int jmxPort = 3012;    // use the same port

and here is my server socket factory. Pretty straightforward material:

public class MyRMIServerSocketFactory implements RMIServerSocketFactory {

    private final InetAddress inetAddress;

    public MyRMIServerSocketFactory(InetAddress inetAddress) {
        this.inetAddress = inetAddress;
    }

    @Override
    public ServerSocket createServerSocket(int port) throws IOException {
        return new ServerSocket(port, 0, inetAddress);
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 97 * hash + (this.inetAddress != null ? this.inetAddress.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final FlexibleRMIServerSocketFactory other = (FlexibleRMIServerSocketFactory) obj;
        if (this.inetAddress != other.inetAddress && (this.inetAddress == null || !this.inetAddress.equals(other.inetAddress))) {
            return false;
        }
        return true;
    }    
}

( equals()and hashCode()automatically generated by my IDE, don't get stuck on them)

I create an RMI registry as follows:

serverSocketFactory = new MyRMIServerSocketFactory(inetAddressBind);
LocateRegistry.createRegistry(
        registryPort,
        RMISocketFactory.getDefaultSocketFactory(),  // client socket factory
        serverSocketFactory // server socket factory
        );       

and then on creating the JMXConnectorServer:

JMXServiceURL url = new JMXServiceURL(
     "service:jmx:rmi://localhost:" + jmxPort + 
      "/jndi/rmi://:" + registryPort + "/jmxrmi");

Map env = new HashMap();
env.put(RMIConnectorServer.RMI_SERVER_SOCKET_FACTORY_ATTRIBUTE, serverSocketFactory);

connector = JMXConnectorServerFactory.newJMXConnectorServer(
                url, 
                env,
                ManagementFactory.getPlatformMBeanServer());

connector.start();

connector.start(), , .

Socket Factory:

LocateRegistry.createRegistry(registryPort);

JMXServiceURL url = new JMXServiceURL(
     "service:jmx:rmi://localhost:" + jmxPort + 
      "/jndi/rmi://:" + registryPort + "/jmxrmi");


connector = JMXConnectorServerFactory.newJMXConnectorServer(
                url, 
                null,
                ManagementFactory.getPlatformMBeanServer());

connector.start();

, , .. .

: " -" Socket Factory?

-

, factory, ..

LocateRegistry.createRegistry(
        registryPort,
        null,  // client socket factory (let it default to whatever RMI lib wants)
        serverSocketFactory // server socket factory
        );       

java.rmi.server.hostname , , , .

+3
2

: equals() ServerSocketFactory, . RMI . factory. null factory, RMISocketFactory.getDefaultSocketFactory(),, sun.rmi.transport.proxy.RMIMasterSocketFactory,, - equals(). RMIClientSocketFactory equals().

, , , RMI CSF, , SSF:

csf1.equals(csf2) && ssf1.equals(ssf2)

ServerSocket , , .

equals, true, == that.

+1

JMXMP jmxremote_optional.jar, . , JMX.

0

All Articles