Notas de Aula - MAC 5759 - Sistemas de Objetos Distribuídos

Aula 10 - 11/4/2001

Java - um Ambiente para Sistemas Distribuídos

Java RMI - Remote Method Invocation

Exemplo

  1. Definição da interface  (Hello.java)
  2. import java.rmi.Remote;
        import java.rmi.RemoteException;

        public interface Hello extends Remote {
            String sayHello() throws RemoteException;
        }
     

  3. Implementação do servidor (HelloImpl.java)
  4.      import java.rmi.Naming;
         import java.rmi.RemoteException;
         import java.rmi.RMISecurityManager;
         import java.rmi.server.UnicastRemoteObject;

         public class HelloImpl extends UnicastRemoteObject implements Hello {

             // precisamos definir um construtor pois o default não gera RemoteException

             public HelloImpl() throws RemoteException {
                 super(); // opcional, vai ser chamado mesmo que não o coloquemos aqui
             }

             public String sayHello() { // note que não tem o throws aqui. A exceção é gerada pela super-classe se for o caso
                 return "Hello World!";
             }

             public static void main(String args[]) {

                 // Create and install a security manager
                 if (System.getSecurityManager() == null) {
                     System.setSecurityManager(new RMISecurityManager());
                 }

                 try {
                     HelloImpl obj = new HelloImpl();

                     // Bind this object instance to the name "HelloServer"
                     Naming.rebind("//myhost/HelloServer", obj);

                     System.out.println("HelloServer bound in registry");
                 } catch (Exception e) {
                     System.out.println("HelloImpl err: " + e.getMessage());
                     e.printStackTrace();
                 }
             }
         }
     

  5. Compilação dos stubs
  6. rmic HelloImpl

    gera os arquivos:

                  HelloImpl_Stub.class
                  HelloImpl_Skel.class
     

  7. Implementação do cliente (neste caso, uma applet  HelloApplet.java)
  8. import java.applet.Applet;
    import java.awt.Graphics;
    import java.rmi.Naming;
    import java.rmi.RemoteException;

    public class HelloApplet extends Applet {

       String message = "blank";
     
       // "obj" is the identifier that we'll use to refer
       // to the remote object that implements the "Hello"
       // interface
       Hello obj = null;

       public void init() {
          try {
              // o lookup carrega o HelloImpl_Stub do CLASSPATH ou do applet code base
               obj = (Hello)Naming.lookup("//" +
                     getCodeBase().getHost() + "/HelloServer");
               message = obj.sayHello();
          }
          catch (Exception e) {
            System.out.println("HelloApplet exception: " + e.getMessage());
             e.printStackTrace();
          } 
       }

       public void paint(Graphics g) {
          g.drawString(message, 25, 50); // mostra a mensagem nas coordenadas dadas
       }
    }
     

Vantagens de Java RMI em relação a CORBA

Desvantagens de Java RMI em relação a CORBA

Solução ideal (???): usar CORBA para comunicação mas implementar o maior número possível de componentes em Java.

Referências



Próxima Aula
Aula Anterior
Página de MAC 5759
Página do Fabio
Página do DCC