- Internetprogrammering 99/00 -

CORBA: Callback i CORBA

Ett litet exempel som illustrerar hur en klient kan deklarera ett objekt som kan anropas av servern.
Baseras på Hello World-exemplet i CORBA-föreläsningen. Jämfört med detta exempel lägger vi till ett objekt i klienten som skickas till servern. Då metoden sayHello i servern anropas så anropar servern i sin tur det HelloCallback-objekt som skickas med som parameter från klienten (dvs ett objekt hos klienten anropas).

UML-diagram

Enhelt UML-diagram

Filen Callback.idl

Modulen Callback ser ut så här:
module Callback
{
 // Klienten implementerar en klass med följande API
 interface HelloCallback
 {
    void callback(in string message);
 };

 // Servern implementerar följande API
 interface Hello
 {
    string sayHello(in HelloCallback objRef, in string message);
 };
};

Kör idltojava

>idltojava -fno-cpp Callback.idl
Ger följande katalog/fil-struktur:
Callback
    Hello.java
    HelloCallback.java
    HelloCallbackHelper.java
    HelloCallbackHolder.java
    HelloHelper.java
    HelloHolder.java
    _HelloCallbackImplBase.java
    _HelloCallbackStub.java
    _HelloImplBase.java
    _HelloStub.java

Servern

import Callback.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;

class CallbackServant extends _HelloImplBase
{
 public String sayHello(HelloCallback callobj, String msg)
 {//Skicka meddelandet callback(...) till callobj som skickats med från klienten
  callobj.callback(msg);
  //Returnera följande sträng till anropande klient
  return "\nHello world !!\n";
 }
}

public class CallbackServer {
 public static void main(String args[]){
 try{
  // skapa och initiera ORB
  ORB orb = ORB.init(args, null);

  // skapa serverobjekt och registrerar det i ORBen
  CallbackServant callbackRef = new CallbackServant();
  orb.connect(callbackRef);

  // skapa referens till namnserver
  org.omg.CORBA.Object objRef =
      orb.resolve_initial_references("NameService");
  NamingContext ncRef = NamingContextHelper.narrow(objRef);

  // bind objektet till namnet "HelloCallback"
  NameComponent nc = new NameComponent("HelloCallback", "");
  NameComponent path[] = {nc};
  ncRef.rebind(path, callbackRef);

  // vänta på klienter
  java.lang.Object sync = new java.lang.Object();
  synchronized (sync) {
   sync.wait();
  }

 } catch (Exception e) {
   System.err.println("ERROR: " + e);
   e.printStackTrace(System.out);
  }
 }
}

Klienten

import Callback.*;
import org.omg.CosNaming.*;
import org.omg.CORBA.*;

// Nu definierar vi klassen som används för att ta hand om callbacks
class HelloCallbackServant extends _HelloCallbackImplBase{
 public void callback(String notification)
 {
  System.out.println("I callbackrutinen: " + notification);
 }
}

public class CallbackClient
{
 public static void main(String args[]){
 try{
  // skapa och initiera ORB
  ORB orb = ORB.init(args, null);

  // skapa referens till namnservern
  org.omg.CORBA.Object objRef =
  orb.resolve_initial_references("NameService");
  NamingContext ncRef = NamingContextHelper.narrow(objRef);

  // skapa referens till objekt med namnet "HelloCallback"
  NameComponent nc = new NameComponent("HelloCallback", "");
  NameComponent path[] = {nc};
  Hello helloRef = HelloHelper.narrow(ncRef.resolve(path));

   // skapa och registrera callbackobjekt
  HelloCallbackServant helloCallbackRef = new HelloCallbackServant();
  orb.connect(helloCallbackRef);

  // anropa servern och skriv  ut resultatet
  String reply = helloRef.sayHello(helloCallbackRef,"\ntest av callback..\n");
  System.out.println(reply);

  } catch (Exception e) {
   System.out.println("ERROR : " + e) ;
   e.printStackTrace(System.out);
  }
 }
}


^ Upp till kursens hemsida.


Sidansvarig: <bjorne@nada.kth.se>
Senast ändrad 21 oktober 1999