Client programs often react to changes or updates that occur in a server. For example, a client graph or spreadsheet program might need to be updated with each stock price update on a stock market server. The client has two options in this scenario: (1) periodically ask for the stock price via a method request on the stock server or (2) ask to be notified by the server whenever a price change occurs. The second option is referred to as a "callback".
Example 3 illustrates how a client program can pass a callback object to a server. The server then issues a method request on the callback object and thereby notifies the client.
Example 3 is identical to Example 1 except for the callback enhancements. This page only discusses the code necessary to these enhancements.
This page contains:
Instructions for compiling and running
the example are provided.
Interface Definition (
Hello.idl)
module HelloApp
{
interface HelloCallback
{
void callback(in string message);
};
interface Hello
{
string sayHello(in HelloCallback objRef, in string message);
};
};
A HelloCallback is defined, which the client will implement.sayHello method is modified to take an object reference
argument and string argument. The object reference argument provides a means
for the client to pass a callback object to the server, which the server can
invoke. The string argument is the string that the server will send back to
the client.
HelloServer.java)// Copyright and License
import HelloApp.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
class HelloServant extends _HelloImplBase
{
public String sayHello(HelloCallback callobj, String msg)
{
callobj.callback(msg);
return "\nHello world !!\n";
}
}
public class HelloServer {
public static void main(String args[])
{
try{
// create and initialize the ORB
ORB orb = ORB.init(args, null);
// create servant and register it with the ORB
HelloServant helloRef = new HelloServant();
orb.connect(helloRef);
// get the root naming context
org.omg.CORBA.Object objRef =
orb.resolve_initial_references("NameService");
NamingContext ncRef = NamingContextHelper.narrow(objRef);
// bind the Object Reference in Naming
NameComponent nc = new NameComponent("Hello", "");
NameComponent path[] = {nc};
ncRef.rebind(path, helloRef);
// wait for invocations from clients
java.lang.Object sync = new java.lang.Object();
synchronized (sync) {
sync.wait();
}
} catch (Exception e) {
System.err.println("ERROR: " + e);
e.printStackTrace(System.out);
}
}
}
The sayHello method implementation has been modified to invoke
the callback object that it receives.
HelloClient.java)// Copyright and License
import HelloApp.*;
import org.omg.CosNaming.*;
import org.omg.CORBA.*;
class HelloCallbackServant extends _HelloCallbackImplBase
{
public void callback(String notification)
{
System.out.println(notification);
}
}
public class HelloClient
{
public static void main(String args[])
{
try{
// create and initialize the ORB
ORB orb = ORB.init(args, null);
// get the root naming context
org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
NamingContext ncRef = NamingContextHelper.narrow(objRef);
// resolve the Object Reference in Naming
NameComponent nc = new NameComponent("Hello", "");
NameComponent path[] = {nc};
Hello helloRef = HelloHelper.narrow(ncRef.resolve(path));
HelloCallbackServant helloCallbackRef = new HelloCallbackServant();
orb.connect(helloCallbackRef);
// call the Hello server object and print results
String hello = helloRef.sayHello(helloCallbackRef,"\ntest..\n");
System.out.println(hello);
} catch (Exception e) {
System.out.println("ERROR : " + e) ;
e.printStackTrace(System.out);
}
}
}
The client implements the HelloCallbackServant object. HelloClient.main instantiates the
callback object and passes it to the server. The client
must also register the callback object with the ORB.
idltojava Hello.idl
javac *.java HelloApp/*.java
tnameserv -ORBInitialPort 1050&
java HelloServer -ORBInitialPort 1050
java HelloClient -ORBInitialPort 1050
| Home |
Copyright © 1995-98 Sun Microsystems, Inc. All Rights Reserved.