RMI bloqueante ou não?

2 respostas
G

Pedi ajuda em outros fóruns sobre isso, mas ainda não obtive retorno, e como estou meio que precisando de uma resposta com urgência, estou tentando atirar em vários lugares :slight_smile:

Minha dúvida é a seguinte: um servidor implementa um método com retorno void (sem retorno), e dentro deste método tem somente um while(true). O cliente, por sua vez, faz a chamada remota a este método, e em seguida mostra uma mensagem local. O cliente bloqueia e nunca mostra a mensagem ou não bloqueia devido ao fato de o método não ter retorno (void)?

Eu implementei e ele bloqueou, nunca mostrou a mensagem, porém em alguns fóruns gringos, disseram que o cliente não deveria bloquear em um método void, e aí eu fiquei confuso, será que fiz algo errado? Seguem os códigos:

Interface do métodos do servidor

public interface IClasseServer extends Remote {
  
    public void infinito() throws RemoteException;
}

Implementação dos métodos

public class ClasseServer extends UnicastRemoteObject implements IClasseServer {

    public ClasseServer() throws RemoteException {
    }

    @Override
    public void infinito() throws RemoteException {

        while(true){
        }

    }
}

Servidor

public class Server {

    public Server() {
        try {
            LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
            ClasseServer c = new ClasseServer();
            Naming.bind("rmi://localhost/IClasseServer", c);
        } catch (Exception e) {
        }
    }

    public static void main(String args[]) {
        new Server();
    }
}

Cliente

public static void main(String args[]) {
        try {
            IClasseServer c = (IClasseServer) Naming.lookup("rmi://localhost/IClasseServer");
            c.infinito();
            System.out.println("Não bloqueio??");
            
        } catch (Exception e) {
            System.out.println("Error: " + e);
        }
    }
}

2 Respostas

DaniloAndrade

pra mim isso vai sempre bloquear porque o rmi não é assíncrono, quando um cliente faz uma chamada remota ele so vai continuar quando o método chamado terminar de executar

G

Obrigado pela resposta!

Pois é, é o que eu acho também, mas como falei, pra tirar a dúvida eu fiz uma pesquisa em alguns outros sites, e alguns mencionam ser assíncrono quando o retorno é void, por isso a confusão…

Criado 7 de maio de 2013
Ultima resposta 7 de mai. de 2013
Respostas 2
Participantes 2