Pau c/ RMI (inxeplicavel, axo)

9 respostas
H

Ae galerinha tava discutindo c o Cococtas 1 pau q ta dando aki c/ 1 teste q tofazendo c RMI, rodamos d+ ja e nd, espero q alguem me ajude e conserte.

O pau q ta dando eh qnd rodo o servidor, a excecao eh esta:

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
         java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
         java.lang.ClassNotFoundException: rmiApp.ServicoDeMensagens_Stub
         at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:385)
         at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240)
         at sun.rmi.transport.Transport$1.run(Transport.java:153)
         at java.security.AccessController.doPrivileged(Native Method)
         at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
         at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
         at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:701)
         at java.lang.Thread.run(Thread.java:595)
         at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:247)
         at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:223)
         at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:343)
         at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
         at java.rmi.Naming.rebind(Naming.java:160)
         at rmiApp.Servidor.main(Servidor.java:10)
 Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
         java.lang.ClassNotFoundException: rmiApp.ServicoDeMensagens_Stub
         at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
         at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:375)
         at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240)
         at sun.rmi.transport.Transport$1.run(Transport.java:153)
         at java.security.AccessController.doPrivileged(Native Method)
         at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
         at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
         at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:701)
         at java.lang.Thread.run(Thread.java:595)
 Caused by: java.lang.ClassNotFoundException: rmiApp.ServicoDeMensagens_Stub
         at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
         at java.security.AccessController.doPrivileged(Native Method)
         at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
         at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
         at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
         at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
         at java.lang.Class.forName0(Native Method)
         at java.lang.Class.forName(Class.java:242)
         at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:430)
         at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165)
         at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620)
         at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247)
         at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:197)
         at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1538)
         at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1460)
         at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1693)
         at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
         at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
         ... 9 more

To fazendo td direitin:

1- escrever interface remota
2- implementar obejto q implementa a interface
3- implementar servidor q registra o nome do objeto
4- gerar stub (e skel)
5- implementar cliente q peskisa o nome do objeto
6- iniciar rmi registry (start rmiregistry)
7- iniciar servidor *** dar pau aki (excecao mostrada) ***
8- inciar cliente

Os codigos:

interface remota

package rmiApp;
 
 import java.rmi.Remote;
 import java.rmi.RemoteException;
 
 public interface Mensagem_IF extends Remote {
     public String getMensagem() throws RemoteException;
     public void setMensagem(String mensagem) throws RemoteException;
 }

objeto q implementa a interface

package rmiApp;
 
 import rmiApp.Mensagem_IF;
 import java.rmi.RemoteException;
 import java.rmi.server.UnicastRemoteObject;
 
 public class ServicoDeMensagens extends UnicastRemoteObject implements Mensagem_IF {
     private String mensagem = "Não há nenhuma mensagem";
 
     public ServicoDeMensagens() throws RemoteException {}
     
     public String getMensagem() throws RemoteException {
         return this.mensagem;
     }
     
     public void setMensagem(String mensagem) throws RemoteException{
         this.mensagem = mensagem;
     }
 }

servidor q registra o ServicoDeMensagens

package rmiApp;
 
 import java.rmi.Naming;
 
 public class Servidor {
 
     public static void main( String[] args ){
         try {
             Mensagem_IF servidor = new ServicoDeMensagens();
             Naming.rebind("servidormsg", servidor);
             System.out.println("Servidor de mensagens no ar.");
         } catch (Exception e ) {
             e.printStackTrace();
         }
    }
 }

cliente q busca o servico

package rmiApp;
 
 import java.rmi.Naming;
 
 public class Cliente {
 
     public static void main( String[] args ){
         try {
             Mensagem_IF obj = (Mensagem_IF) Naming.lookup("rmi://localhost/servidormsg" );
             System.out.println("Recebido:" + obj.getMensagem());
             obj.setMensagem("Bom dia!");
         } catch (Exception e ) {
             e.printStackTrace();
         }
     }
 }

Alguem sabe oq eh isso? Ja tentei td e n roda e axo q ta td certo!!! :confused:

9 Respostas

Abdon

Eu acho que isto esta acontecendo prq o Stub não esta no cliente. (Stub gerado pelo rmic)

H

Ta sim, eu to rodando localmente, ai tds arquivos tao aki no meu pc. E tb, lembrando q o pau ta dando qnd eu rodo o servidor (e n xego nem a rodar o cliente ainda)

H

fiz outra aplicacao de teste, deu msm erro. fico puto c esses erros q eu n sei de onde vem. :frowning:

H

seguinte consegui rodar esta aplicacao dps de mto sacrificio, mas n consigo roda-la c o .jar da app (n sei pq), vo fazer o seguinte: eu axo q pode ser problema aki, tem como alguem testar?

so descompactar o arquivo .rar e fazer:

  • start rmiregistry
  • java -jar rmiApp.jar (executa servidor)
  • java -cp rmiApp.jar rmiApp.Cliente (executa cliente)

se pegar ou nao posta ai q kero saber oq ta contecendo. usei o netbeans 5. vlws…

ps: se der execao (n pegou), se escrever 1 frase ai (ai pegou blz)

H

rpz, axo q finalmente consegui, eu n tava iniciando o start rmiregistry dentro da pasta do meus .class, eu ia la adivinhar isso??? sempre tem q inciar o rmiregsitry dentro da pasta dos .class???

Cocota

Nunca li nada sobre essa história de ter que executar o rmiregistry dentro da sua pasta .class
Mas faz sentido, seu rmiregistry não tava encontrando o stub. Agora tá, né?

H

vc executa fora?

eu lin nun pdf e fiz, eu perguntei a 1 amigo meu q confirmou tb. vc ja testou rodar start rmiregistry sem ta pasta corrente dos .class? funcionou?

eu so axei 1 solucao p rodar o rmiregistry em qlq lugar, setando -classpath c/ o stub qnd rodar o servidor, foi assim q vc fez?

Cocota

não…
rodei fora mesmo…

foi no linux:

$ rmiregistry & 
$ java pacote.Server &
$ java pacote.Client
[...]
H

bem eh necessario q vc rode dentro da pasta pq, pelo q li, o rmiregistry ira saber onde o stub esta, mas se vc colocar o stub nas variaveis de ambiente ou indicar c classpath, ai vc pode execuatr de onde quiser o rmiregistry, pode ser q no linux, ou vc tenha feito isso, ou ele tenha feito isso “por baixo” p vc.

Criado 4 de agosto de 2006
Ultima resposta 7 de ago. de 2006
Respostas 9
Participantes 3