FULL PRODUCT VERSION :
java version "1.6.0_21"
Java(TM) SE Runtime Environment (build 1.6.0_21-b06)
Java HotSpot(TM) 64-Bit Server VM (build 17.0-b16, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Linux thinkborg 2.6.32-25-generic #44-Ubuntu SMP Fri Sep 17 20:05:27 UTC 2010 x86_64 GNU/Linux
A DESCRIPTION OF THE PROBLEM :
In our RMI application we want to fix the RMI communication port to a known value. This is why we have implemented our RMISocketFactory.
We also want to run the JVM with management arguments:
-Dcom.sun.management.jmxremote.port=3401
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Using this setting renders our RMISocketFactory useless.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
First run:
java -Dcom.sun.management.jmxremote.port=3002 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=true rmi.Server
and you'll get "Expected Results". If you now run "netstat -nap | grep java" you can see ports 3000, 3001, 3002 being listen at:
tcp6 0 0 :::46558 :::* LISTEN 18772/java
tcp6 0 0 :::34664 :::* LISTEN 18772/java
tcp6 0 0 :::3000 :::* LISTEN 18772/java
tcp6 0 0 :::3001 :::* LISTEN 18772/java
tcp6 0 0 :::3002 :::* LISTEN 18772/java
Now If you run:
java -Dcom.sun.management.jmxremote.port=3002 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false rmi.Server
you will get "Actual Result". If you now run "netstat -nap | grep java" you can see ports 3000, 3002 being listen at, but there is no 3001 port:
tcp6 0 0 :::59499 :::* LISTEN 18737/java
tcp6 0 0 :::3000 :::* LISTEN 18737/java
tcp6 0 0 :::60794 :::* LISTEN 18737/java
tcp6 0 0 :::3002 :::* LISTEN 18737/java
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
FixedRMISocketFactory BEGIN
FixedRMISocketFactory END
CreateRegistry BEGIN
---------------- createServerSocket begin ----------------
createServerSocket port = 3000
createServerSocket defaultPort = 3001
Create server socket for port = 3000
---------------- createServerSocket end ----------------
CreateRegistry END
Naming.bind BEGIN
---------------- createServerSocket begin ----------------
createServerSocket port = 0
createServerSocket defaultPort = 3001
Create server socket for port = 3001
---------------- createServerSocket end ----------------
---------------- createSocket begin ----------------
createSocket host = localhost
createSocket port = 3000
createSocket defaultPort = 3001
Create socket for host = localhost and port = 3000
---------------- createSocket end ----------------
---------------- createSocket begin ----------------
createSocket host = 127.0.1.1
createSocket port = 3001
createSocket defaultPort = 3001
Create socket for host = 127.0.1.1 and port = 3001
---------------- createSocket end ----------------
Naming.bind END
ACTUAL -
FixedRMISocketFactory BEGIN
FixedRMISocketFactory END
CreateRegistry BEGIN
---------------- createServerSocket begin ----------------
createServerSocket port = 3000
createServerSocket defaultPort = 3001
Create server socket for port = 3000
---------------- createServerSocket end ----------------
CreateRegistry END
Naming.bind BEGIN
---------------- createSocket begin ----------------
createSocket host = localhost
createSocket port = 3000
createSocket defaultPort = 3001
Create socket for host = localhost and port = 3000
---------------- createSocket end ----------------
---------------- createSocket begin ----------------
createSocket host = 127.0.1.1
createSocket port = 59499
createSocket defaultPort = 3001
Create socket for host = 127.0.1.1 and port = 59499
---------------- createSocket end ----------------
Naming.bind END
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
------------------ TimeServer.java -----------------------------
package rmi;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.Date;
public interface TimeServer extends Remote
{
public Date getCurrentDate() throws RemoteException;
}
------------------------------------------------------------------------------------------
------------- TimeServerImpl.java -----------------------------------------
package rmi;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Date;
public class TimeServerImpl extends UnicastRemoteObject implements TimeServer
{
public TimeServerImpl() throws RemoteException
{
}
public Date getCurrentDate() throws RemoteException
{
return new Date(System.currentTimeMillis());
}
}
-----------------------------------------------------------------------
---------------------- Server.java ------------------------------
package rmi;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Server {
public static void main(String args[]) {
try {
System.out.println("FixedRMISocketFactory BEGIN");
FixedRMISocketFactory.install(3001);
System.out.println("FixedRMISocketFactory END");
System.out.println("CreateRegistry BEGIN");
Registry registry = LocateRegistry.createRegistry(3000);
System.out.println("CreateRegistry END");
System.out.println("Naming.bind BEGIN");
Naming.bind("rmi://localhost:3000/TimeServer", new TimeServerImpl());
System.out.println("Naming.bind END");
} catch (Exception e) {
e.printStackTrace();
}
}
}
---------------------------------------------------------------------------------
---------- END SOURCE ----------
java version "1.6.0_21"
Java(TM) SE Runtime Environment (build 1.6.0_21-b06)
Java HotSpot(TM) 64-Bit Server VM (build 17.0-b16, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Linux thinkborg 2.6.32-25-generic #44-Ubuntu SMP Fri Sep 17 20:05:27 UTC 2010 x86_64 GNU/Linux
A DESCRIPTION OF THE PROBLEM :
In our RMI application we want to fix the RMI communication port to a known value. This is why we have implemented our RMISocketFactory.
We also want to run the JVM with management arguments:
-Dcom.sun.management.jmxremote.port=3401
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Using this setting renders our RMISocketFactory useless.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
First run:
java -Dcom.sun.management.jmxremote.port=3002 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=true rmi.Server
and you'll get "Expected Results". If you now run "netstat -nap | grep java" you can see ports 3000, 3001, 3002 being listen at:
tcp6 0 0 :::46558 :::* LISTEN 18772/java
tcp6 0 0 :::34664 :::* LISTEN 18772/java
tcp6 0 0 :::3000 :::* LISTEN 18772/java
tcp6 0 0 :::3001 :::* LISTEN 18772/java
tcp6 0 0 :::3002 :::* LISTEN 18772/java
Now If you run:
java -Dcom.sun.management.jmxremote.port=3002 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false rmi.Server
you will get "Actual Result". If you now run "netstat -nap | grep java" you can see ports 3000, 3002 being listen at, but there is no 3001 port:
tcp6 0 0 :::59499 :::* LISTEN 18737/java
tcp6 0 0 :::3000 :::* LISTEN 18737/java
tcp6 0 0 :::60794 :::* LISTEN 18737/java
tcp6 0 0 :::3002 :::* LISTEN 18737/java
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
FixedRMISocketFactory BEGIN
FixedRMISocketFactory END
CreateRegistry BEGIN
---------------- createServerSocket begin ----------------
createServerSocket port = 3000
createServerSocket defaultPort = 3001
Create server socket for port = 3000
---------------- createServerSocket end ----------------
CreateRegistry END
Naming.bind BEGIN
---------------- createServerSocket begin ----------------
createServerSocket port = 0
createServerSocket defaultPort = 3001
Create server socket for port = 3001
---------------- createServerSocket end ----------------
---------------- createSocket begin ----------------
createSocket host = localhost
createSocket port = 3000
createSocket defaultPort = 3001
Create socket for host = localhost and port = 3000
---------------- createSocket end ----------------
---------------- createSocket begin ----------------
createSocket host = 127.0.1.1
createSocket port = 3001
createSocket defaultPort = 3001
Create socket for host = 127.0.1.1 and port = 3001
---------------- createSocket end ----------------
Naming.bind END
ACTUAL -
FixedRMISocketFactory BEGIN
FixedRMISocketFactory END
CreateRegistry BEGIN
---------------- createServerSocket begin ----------------
createServerSocket port = 3000
createServerSocket defaultPort = 3001
Create server socket for port = 3000
---------------- createServerSocket end ----------------
CreateRegistry END
Naming.bind BEGIN
---------------- createSocket begin ----------------
createSocket host = localhost
createSocket port = 3000
createSocket defaultPort = 3001
Create socket for host = localhost and port = 3000
---------------- createSocket end ----------------
---------------- createSocket begin ----------------
createSocket host = 127.0.1.1
createSocket port = 59499
createSocket defaultPort = 3001
Create socket for host = 127.0.1.1 and port = 59499
---------------- createSocket end ----------------
Naming.bind END
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
------------------ TimeServer.java -----------------------------
package rmi;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.Date;
public interface TimeServer extends Remote
{
public Date getCurrentDate() throws RemoteException;
}
------------------------------------------------------------------------------------------
------------- TimeServerImpl.java -----------------------------------------
package rmi;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Date;
public class TimeServerImpl extends UnicastRemoteObject implements TimeServer
{
public TimeServerImpl() throws RemoteException
{
}
public Date getCurrentDate() throws RemoteException
{
return new Date(System.currentTimeMillis());
}
}
-----------------------------------------------------------------------
---------------------- Server.java ------------------------------
package rmi;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Server {
public static void main(String args[]) {
try {
System.out.println("FixedRMISocketFactory BEGIN");
FixedRMISocketFactory.install(3001);
System.out.println("FixedRMISocketFactory END");
System.out.println("CreateRegistry BEGIN");
Registry registry = LocateRegistry.createRegistry(3000);
System.out.println("CreateRegistry END");
System.out.println("Naming.bind BEGIN");
Naming.bind("rmi://localhost:3000/TimeServer", new TimeServerImpl());
System.out.println("Naming.bind END");
} catch (Exception e) {
e.printStackTrace();
}
}
}
---------------------------------------------------------------------------------
---------- END SOURCE ----------