2016-05-29 4 views
0

Мой проект, который использует RMI, так делится:RMI реестра и Illegal Довод Исключение

два интерфейса, ISportello и IGestoreSportelli.

public interface IGestoreSportelli extends Remote { 


public boolean sottoponiRichiesta (int id) throws RemoteException; 
public void sottoscrivi (ISportello sportello) throws RemoteException; 

} 


public interface ISportello { 
public boolean serviRichiesta(int id) throws RemoteException; 
} 

Два класса, который реализует логику приложения, и реализует интерфейсы: GestoreSportelliImplementazione и SportelloImplementazione

public class GestoreSportelliImplementazione implements IGestoreSportelli{ 

public Vector<ISportello> sportelli = new Vector<ISportello>(); 
@Override 
public boolean sottoponiRichiesta(int id) throws RemoteException { 
    System.out.println("Processo la richiesta: id:" + id); 
    int size = sportelli.size(); 
    int i=0; 
    boolean esito = false; 

    do { 
     esito = sportelli.get(i++).serviRichiesta(id); 
    }while(i<size && !esito); 

    return esito; 
} 

@Override 
public void sottoscrivi(ISportello sportello) throws RemoteException { 
    System.out.println("[GESTORE] Aggiungo un nuovo sportello"); 
    System.out.println("SPORTELLO: " + sportello); 
    sportelli.add(sportello); 

} 

    } 


@SuppressWarnings("serial") 
public class SportelloImplementazione extends UnicastRemoteObject implements ISportello{ 

protected SportelloImplementazione() throws RemoteException { 
    super(); 
} 

@Override 
public boolean serviRichiesta(int id) throws RemoteException { 
    // TODO Auto-generated method stub 
    return true; 
} 

} 

Второй класс заглушки (я буду развиваться, если в дальнейшем, когда я буду знать, почему программа не работает, как есть).

Два класса с основными функциями, которые "обертывают" предыдущие два класса

public class GestoreSportelliServer { 

public static void main(String[] args) { 
    try { 
    IGestoreSportelli gestore = new GestoreSportelliImplementazione(); 
    Registry rmi = LocateRegistry.getRegistry(); 
    IGestoreSportelli gestoreRef = (IGestoreSportelli) UnicastRemoteObject.exportObject(gestore,0); 
    System.out.println("[GESTORE] AVVIATO"); 
    System.out.println("[GESTORE] " + gestore); 
    rmi.rebind("gestore", gestoreRef); 
    System.out.println("[GESTORE] Registrato"); 
    } 
    catch (RemoteException r) 
    { 
     r.printStackTrace(); 
    } 
} 
} 



public class SportelloServer { 

public static void main(String[] args) { 
    try { 
    Registry rmi = LocateRegistry.getRegistry(); 
    ISportello sportello = new SportelloImplementazione(); 
    System.out.println("[SPORTELLO] : " + sportello); 
    IGestoreSportelli gestore =(IGestoreSportelli) rmi.lookup("gestore"); 
    gestore.sottoscrivi(sportello); 
    System.out.println("[SPORTELLO] Sottoscrizione avvenuta"); 
    } 
    catch (RemoteException r) 
    { 
     r.printStackTrace(); 

    } 

    catch (NotBoundException n) 
    { 
     n.printStackTrace(); 
    } 

    catch (IllegalArgumentException i) 
    { 
     i.printStackTrace(); 

System.out.println (i.getmessage()); }

} 

} 

Я бег классов с основными в два differend быстрых окон, а третья подсказка окно запускает RMIRegistry. Класс SportelloServer не работает. Она работает в исключение:

java.lang.IllegalArgumentException: [email protected] 
at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source) 
at sun.rmi.transport.Transport$1.run(Unknown Source) 
at sun.rmi.transport.Transport$1.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at sun.rmi.transport.Transport.serviceCall(Unknown Source) 
at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source) 
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source) 
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source) 
at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source) 
at sun.rmi.server.UnicastRef.invoke(Unknown Source) 
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source) 
at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source) 
at com.sun.proxy.$Proxy1.sottoscrivi(Unknown Source) 
at server.SportelloServer.main(SportelloServer.java:19) 
[email protected] 

# 19 линия:

gestore.sottoscrivi(sportello); 
+0

Есть ли больше трассировки стека? – EJP

+0

Нет, ничего. Я не знаю, что я сделал неправильно, и это очень простой код. – EagleOne

+0

Кто напечатал нижнюю строку? Тот, который просто читает 'java.lang.ClassCastException @ ...'? И все эти классы и интерфейсы в одном пакете? – EJP

ответ

0

Оба интерфейса должны расширить Remote:

public interface ISportello extends Remote{ 
public boolean serviRichiesta(int id) throws RemoteException; 
} 

Является ли правильный код ISportello

Смежные вопросы