Мой проект, который использует 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);
Есть ли больше трассировки стека? – EJP
Нет, ничего. Я не знаю, что я сделал неправильно, и это очень простой код. – EagleOne
Кто напечатал нижнюю строку? Тот, который просто читает 'java.lang.ClassCastException @ ...'? И все эти классы и интерфейсы в одном пакете? – EJP