Re:RMI + Exception estranha

Olá,

Eu tive essa exception passando objetos como parâmetro… resolvi definindo o serialVersionUID.
Tenta a sorte ae :stuck_out_tongue:

Boas tardes a todos.

Estou trabalhando com uma arquitetura RMI e estou obtendo a seguinte exception quando chamo o serviço no cliente:

java.rmi.MarshalException: error marshalling arguments; nested exception is: java.net.SocketException: Software caused connection abort: socket write error

Nunca obtive esse problema, tudo bem que estou trabalhando com RMI há pouco mais de uma semana, :stuck_out_tongue:

Segue o código na máquina cliente:

Registry registry = LocateRegistry.getRegistry("192.168.0.175", 1603); PartService partService = (PartService) registry.lookup(?part-service?); partService.insertPart(partVO);

E agora o código que disponibiliza o serviço:

[code]// coloco todos os serviços em um HashMap
services.put(?part-service?, UnicastRemoteObject.exportObject(new PartServiceImpl(), 0));

// rodo o Map disponibilizando os serviços
Registry registry = LocateRegistry.getRegistry(1603);

for(String key : services.keySet()) {
registry.rebind(key, services.get(key));
}[/code]

A interface PartService é uma sub-interface de java.rmi.Remote e a classe PartServiceImpl implementa a interface PartService.

O rmiregistry está sendo executado na porta 1603, então o problema não é nem com o bind tão pouco com o lookup, que retorna uma instância válida, pelo que percebi. O problema é só quando chamo um método do stub no cliente.

Não consigo achar na net alguma informação que possa me ajudar. A SocketException, pelo que li, ocorre quando, por exemplo, tento enviar dados sem fechar o stream de entrada. Mas não consigo enxergar isso no meu caso, alguém consegue?

Acabo de descobrir uma coisa: Esse erro ocorre quando executo a chamada remota em um objeto de negócio chamado por uma Servlet. No entanto, em um main() nessa mesma classe, executei a chamada remota e tudo executou normalmente.

Obrigado pela atenção e pela ajuda.

Bem, descobri outra coisa:

O problema só pode ser porque estou executando a chamada remota de um objeto que foi chamado por uma Servlet. Fiz alguns testes aqui, para eliminar algumas possibilidades e o cenário é, de fato, esse que acabo de colocar. O Tomcat está me ferrando.

Agora, a pergunta é: por que?

Gobain,

Todos os meus objetos que são Serializable têm um serialVersionUID, até mesmo pq o Eclipse dá warning (tudo bem que dá pra tirar o warning, mas enfim)

Boas tardes,

Consegui solucionar o problema, que na verdade eram 2:

1o: É sempre bom ter uma referência para o objeto do qual será gerado um stub, isso no Servidor. Eu mantinha essa referência, mas não do objeto Remote, e sim do stub. Isso me gerou o primeiro problema. Mudei a minha referência para a instância do meu objeto e o 1o problema foi resolvido.

2o: Resolvido o problema da referência estática para os objetos no servidor, o erro mudou para MalformedURLException, indicando “Content/WEB-INF/classes/”. Reconheci que o Content na verdade é “Web Content”, da minha estrutura de projetos do Eclipse. Bem, imaginei que seria impossível ser isso, já que eu só trabalho com esse diretório em ambiente de senvolvimento. Mas qual não foi minha surpresa quando Renomeei a pasta para WebContent, sem espaço: FUNCIONOU! Mas só vi essa exception porque quando inicializei o servidor, na linha de comando, utilizei a seguinte intrução:

Isso começou a registrar detalhes da exception, ao invés de falar que a operação foi abortada.

Já inclui na base de conhecimentos aqui. Tenho certeza que, se alguém passou por isso, adorará saber desse parâmetro do RMI.

Obrigado pela ajuda de todos. Um grande abraço.

Balrogg.