RMI: Não gera skeletons

3 respostas
W

Olá, estou aprendendo RMI e seguindo o livro Use a Cabeça Java deu um erro mesmo fazendo exatamente igual ao livro. Agradeço qualquer ajuda pra entender isso.
Seguem os passos:

Terminal 1 Gerando os .class da interface e implementação
C:\Java>javac MyRemote.java
C:\Java>javac MyRemoteImpl.java

C:\Java>rmic MyRemoteImpl
OBS: só gera MyRemoteImpl_Stub.class e segundo o livro esse comando deveria gerar também MyRemoteImpl_Skel.class
Terminal 2
C:\Java>rmiregistry --> inicia o registro do RMI

Terminal 1
C:\Java>java MyRemoteImpl
[color=red]java.net.MalformedURLException: invalid URL String: Remote Hello
at java.rmi.Naming.parseURL(Unknown Source)
at java.rmi.Naming.rebind(Unknown Source)
at MyRemoteImpl.main(MyRemoteImpl.java:19)
Caused by: java.net.URISyntaxException: Illegal character in path at index 6: Re
mote Hello
at java.net.URI$Parser.fail(Unknown Source)
at java.net.URI$Parser.checkChars(Unknown Source)
at java.net.URI$Parser.parseHierarchical(Unknown Source)
at java.net.URI$Parser.parse(Unknown Source)
at java.net.URI.(Unknown Source)
at java.rmi.Naming.intParseURL(Unknown Source)
... 3 more[/color]

Seguem os códigos:

//Exercício pág. 429 livro Use a Cabeça Java. Explicações na pág. 427

import java.rmi.*;

public interface MyRemote extends Remote{

	public String sayHello() throws RemoteException;
}
//Exercício pág. 429 livro Use a Cabeça Java.

import java.rmi.*;
import java.rmi.server.*;

public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote{
	/**A classe UnicastRemoteObject declara a exceção RemoteException, então, 
	 * a classe que a estende deve ter um construtor que lança esse tipo de exceção*/ 
	public MyRemoteImpl() throws RemoteException{
	}
	
	public String sayHello(){
		return "Server says, ´Hey´";
	}	
	
	public static void main(String[] args){
		try{
			MyRemote service = new MyRemoteImpl();//instancia o serviço remoto
			Naming.rebind("Remote Hello", service);//registra o serviço remoto no RMI
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
}
import java.rmi.*;

public class MyRemoteClient {
	public static void main (String[] args){
		new MyRemoteClient().go;
	}
	
	public void go(){
		try{
			MyRemote service = (MyRemote) Naming.lookup("rmi://999.999.999.999/RemoteHello");
			String s = service.sayHello();
			System.out.println(s);
		}catch(Exception ex){
			ex.printStackTrace();
		}
	}
}

3 Respostas

J

não tem nada a ver com isso não, você que informou o nome errado, olha aqui:

você escreveu o nome separado “Remote Hello”

Naming.rebind("Remote Hello", service);//registra o serviço remoto no RMI

e aqui você escreveu o nome junto “RemoteHello”, logo você não tenhum serviço com esse nome, tem “Remote Hello” e não “RemoteHello”. Logo o erro não é culpa do RMI.

MyRemote service = (MyRemote) Naming.lookup("rmi://999.999.999.999/RemoteHello");

coloque isso que deve funcionar:

Naming.rebind("RemoteHello", service);//registra o serviço remoto no RMI
victorwss

Não sei o que o livro diz. Mas a partir do java 1.2, você não precisa mais de skeletons.
E li recentemente que a partir do java 1.5, é possível eliminar-se o stub também.

W

não tem nada a ver com isso não, você que informou o nome errado, olha aqui:

você escreveu o nome separado “Remote Hello”


Eu não havia executado essa parte ainda, devido ao erro que deu, logo o erro não era por causa disso, mas claro, se executasse a classe cliente iria dar erro, pois na implementação estaria “Remote Hello” e na chamada do cliente estaria “RemoteHello”, mas já consertei.
O livro mostra Naming.rebind(“Remote Hello”, service);
Coloquei a string sem espaço “RemoteHello” e funcionou, o livro deve estar errado ou a versão java 1.4 funciona com espaço e a versão 1.5 ou 6 talvez não funcione.

Não sei o que o livro diz. Mas a partir do java 1.2, você não precisa mais de skeletons.
E li recentemente que a partir do java 1.5, é possível eliminar-se o stub também.

Está explicado por que não foi gerado o skeleton.

Testei sem executar C:\Java>rmic MyRemoteImpl que gera o stub e funcionou.
Na versão java 6, que é a que uso, realmente não precisa de stub ou skeleton.
Obrigado :mrgreen:

Criado 27 de abril de 2009
Ultima resposta 27 de abr. de 2009
Respostas 3
Participantes 3