Olá!
Estou desenvolvendo um exemplo acadêmico sobre RMI baseado em um exemplo clássico do assunto (lâmpada no estado acesa ou apagada). A comunicação está acontecendo perfeitamente, mas o erro está quanto tento cortar o serviço.
No meu servidor eu tenho uma janela com um JTextField (onde é digitado o número da porta) e dois JButton’s um para ativar e outro para desativar o serviço. Cada um dos botões citadados chama os seguintes métodos respectivamente:
public void ativar(){
try {
desativar();
registrador = Runtime.getRuntime().exec( "rmiregistry " + txtPorta.getText() );
luzCompartilhada = new RMILuzImpl();
String registro = "rmi://localhost:" + txtPorta.getText() + "/RMILuz";
Naming.rebind( registro, luzCompartilhada );
lblStatus.setText("Ativado... \nPorta: " + txtPorta.getText() );
lblStatus.setForeground( Color.GREEN );
} catch (Exception e) {
JOptionPane.showMessageDialog( this, "Erro na Ativação", "O Serviço não pode ser inicializado!", JOptionPane.ERROR);
}
}
public void desativar() {
try {
Naming.unbind("rmi://localhost:" + txtPorta.getText() + "/RMILuz");
} catch (Exception e) {
e.printStackTrace();
}
if (registrador != null) registrador.destroy();
lblStatus.setText("Desativado...");
lblStatus.setForeground(Color.RED);
}
Vou enumerar os testes que fiz para tentar isolar e demonstrar o erro:
1 - Se desativar o servidor e tentar conectar um cliente ele não conecta (correto);
2 - Se ativar o servidor e tentar conectar um cliente ele conecta (correto);
3 - Se tentar desativar o servidor com algum cliente conectado o método desativar é executado sem problemas, mas os clientes continuam invocando os métodos remotos como se o serviço ainda estivesse ativo e só param de funcionar se eu fechar o programa servidor por completo(errado).
Eu não quero ter que fechar o programa servidor para que os cliente percam a referência para o objeto remoto.
Como posso fazer isso apenas chamando o método desativar?