Presentation:RMI Continued 2
Using The Registry & Callbacks
Ingeniørhøjskolen i ÅrhusSlide 2 af 12
Goals of this lesson
• After this 1x35 lessons you will be– Introduced to the RMI registry (rmiregistry)
• And how to use it
– Introduced to RMI Callbacks
• Next time Java RMI Activation and RMI IIOP
Ingeniørhøjskolen i ÅrhusSlide 3 af 12
Outline
• Group presentation – RMI compared with Web services (SOAP)
• Theory: (35 min.) – Repetition from last time
• The Architecture of Java RMI and the RMI registry
– The concept of Callbacks in Java RMI
• Exercises– Many had trouble last time– Complete this– Make a callback version of HelloWorld
Ingeniørhøjskolen i ÅrhusSlide 4 af 12
Java compiler - javac
Server
HelloClient.javaHelloClient.javaHelloImpl.javaHelloImpl.java
Java compiler - javacJava compiler - javac
Client
Hello.javaHello.java
included ingeneratesreads
rmic Compiler
RMI Client and Server Implementation
HelloImpl_Stub.classHelloImpl_Stub.class HelloImpl_Skeleton.classHelloImpl_Skeleton.class
Ingeniørhøjskolen i ÅrhusSlide 5 af 12
Architecture
ServerClient
Stub RegistryInterfaces
Skeleton ActivationInterfaces
RMI Runtime (rmid,rmiregistry)
coded manuallycoded manually
rmic generatedrmic generated rmic generatedrmic generated
bindbindlookuplookup
Ingeniørhøjskolen i ÅrhusSlide 6 af 12
Naming in RMI: The RMI Registry
• Simplified version of CORBA Naming• No composite names• Security Restriction: Name bindings cannot be
created from remote hosts• There has to be a registry on each host
Ingeniørhøjskolen i ÅrhusSlide 7 af 12
Naming in RMI: The RMI Registrypackage java.rmi.registry;
public interface Registry extends java.rmi.Remote { public static final int REGISTRY_PORT = 1099; public java.rmi.Remote lookup(String name) throws java.rmi.RemoteException, java.rmi.NotBoundException, java.rmi.AccessException; public void bind(String name, java.rmi.Remote obj) throws java.rmi.RemoteException, java.rmi.AlreadyBoundException, java.rmi.AccessException; public void rebind(String name, java.rmi.Remote obj) throws java.rmi.RemoteException, java.rmi.AccessException; public void unbind(String name) throws java.rmi.RemoteException, java.rmi.NotBoundException, java.rmi.AccessException; public String[] list() throws java.rmi.RemoteException, java.rmi.AccessException;}
Ingeniørhøjskolen i ÅrhusSlide 8 af 12
package examples.hello;
import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.RMISecurityManager; import java.rmi.server.UnicastRemoteObject;
public class HelloImpl extends UnicastRemoteObject implements Hello {
public HelloImpl() throws RemoteException { super(); }
public String sayHello() {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("rmi://192.168.1.101/HelloServer", obj);
System.out.println("HelloServer bound in registry"); } catch (Exception e) { System.out.println("HelloImpl err: " + e.getMessage()); e.printStackTrace(); } } }
Server object(HelloImpl.java)
Instantiate a new object and register (bind it) in the ”rmiregistry”
Following methods available:bind, rebind, unbind, lookup
Instantiate a new object and register (bind it) in the ”rmiregistry”
Following methods available:bind, rebind, unbind, lookup
Ingeniørhøjskolen i ÅrhusSlide 9 af 12
package examples.hello;
import java.rmi.Naming;import java.rmi.RemoteException;
public class HelloClient {
public static void main(String args[]) { try { obj = (Hello)Naming.lookup("rmi://192.168.1.101/HelloServer"); String message = obj.sayHello(); System.out.println(message); } catch (Exception e) { System.out.println("HelloApplet exception: " + e.getMessage()); e.printStackTrace(); } }
}
”lookup” the HelloServer – and call Method sayHello() on Stub
”lookup” the HelloServer – and call Method sayHello() on Stub
Client object(HelloClient.java)
Ingeniørhøjskolen i ÅrhusSlide 10 af 12
Limitations of Naming
• Limitation of Naming in all approaches: Client always has to identify the server by name.
obj = (Hello)Naming.lookup("rmi://192.168.1.101/HelloServer");
• Inappropriate if client just wants to use a service at a certain quality but does not know from who:– Automatic cinema ticketing,– Video on demand,– Electronic commerce.
• Security restriction breaks name location transparency
Ingeniørhøjskolen i ÅrhusSlide 11 af 12
Nice feature – bootstrapping the Registry
• As until now, you have been manually starting the RMI Registry, which is a constant source of errors and other inconviances.
• May be solved more elegantly:– LocateRegistry.createRegistry(PORT);
• And you are up and running, ready to bind remote objects
Ingeniørhøjskolen i ÅrhusSlide 12 af 12
Callbacks
• Remember PRJ3 / OBJ?• Sometimes Client/Server is not enough• Publish/Subscribe pattern / Observer• CORBA has support for this
– An ORB is always both client and server
• Java RMI does not have support for this• Solution:
– Turn the client object into a remote object