RMI- nevytvori se socket bez pouziti timeoutu po exportu

Petr Prikryl peter.prikryl na gmail.com
Středa Říjen 14 23:52:47 CEST 2009


Dobry vecer,
resim problem v domacim ukolu:
napsal jsem kod: [fragment]

public class Server {

    Logger log = LoggerFactory.getLogger(this.getClass());
    Registry registry;
    int registryPort = 55554;
    String stubName = "piskvornik";
    int port = 55555;
    String hostname = "localhost";
    private PiskvornikServerInterface piskvornik;
    PiskvornikServerInterface piskvornikStub;

    public Server(String ipAddress, int serverPort) {

        if (System.getSecurityManager() == null) {
            log.debug("System.getSecurityManager() = null. Creating new 
one.");
            System.setSecurityManager(new RMISecurityManager());
//            System.out.println("WWWW"+ System.getSecurityManager().);
        }
        System.setProperty("java.rmi.server.hostname", ipAddress);
        registryPort = 55554;
        stubName = "piskvornik";
        port = serverPort;


        try {

            log.debug("Registry created at PORT " + registryPort);
            piskvornik = new PiskvornikServer();
            piskvornikStub = (PiskvornikServerInterface) 
UnicastRemoteObject.exportObject(piskvornik, port, new RCSF(), new 
RSSF(ipAddress));
            registry = LocateRegistry.createRegistry(registryPort);

            log.debug("stub piskvornik created");
            registry.rebind(stubName, piskvornikStub);
            log.debug(stubName + " binded into registry " + registry);
        } catch (RemoteException ex) {
            log.error(ex.getMessage());
        }



    }
}

Jde o RMI server, ktery vytvori RMIregistry a do nich chce zaregistrovat 
object piskvornikStub.
Vyskytuje se mi anomalie pri spousteni programu:
pokud za
            piskvornikStub = (PiskvornikServerInterface) 
UnicastRemoteObject.exportObject(piskvornik, port, new RCSF(), new
nedam timeout
Program se normalne spusti a bezi ale neni vytvoren socket ktery by mohl 
komunikovats klienty
pokud tento timeout nasimuluji napr vlozenim kodu
new Scanner(System.in).readline();
pak vse probehne v poradku.

Mam podezreni ze java neni schopna dostatecne rychle zainteragovat s 
kernelem a vytvorit socket a nekde se to uvnitr JVM rozbije.

Tato anomalie se stane nekdy 1/10 nekdy 10/10 a uz si opravdu nevim 
rady. pricemz spoustim aplikaci porad stejne z konzole, zadna zmena  ....

Dekuji za vsechny rady.

Diky
PP

muj system::

petr na lenovo:~$ java -version
java version "1.6.0_15"
Java(TM) SE Runtime Environment (build 1.6.0_15-b03)
Java HotSpot(TM) 64-Bit Server VM (build 14.1-b02, mixed mode)
petr na lenovo:~$ cat /proc/version
Linux version 2.6.31-13-generic (buildd na yellow) (gcc version 4.4.1 
(Ubuntu 4.4.1-4ubuntu7) ) #45-Ubuntu SMP Tue Oct 13 02:07:24 UTC 2009
petr na lenovo:~$
CPU Intel C2D

RCSF a RSSF jsou klasicke sockety
public class RSSF implements RMIServerSocketFactory, Serializable {
    private static final long serialVersionUID = 91477001985329L;

    String hostname;

    public RSSF(String hostname) {
        this.hostname = hostname;
    }

    @Override
    public ServerSocket createServerSocket(int port) throws IOException {
        return new ServerSocket(port, 0, 
InetAddress.getByName(this.hostname));
    }
}
 

-- 
Petr Prikryl
-----------------------
petrprikryl na centrum.cz
prikryl na admin24.cz
www.admin24.cz




Další informace o konferenci Konference