Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-6988262

Fixed RMISocketFactory useless with jmxremote.ssl set to false

XMLWordPrintable

      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 ----------

            sjiang Shanliang Jiang (Inactive)
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: