Event-Service

Gute und vollständige Event-Service Implementierungen scheinen noch etwas rar zu sein. Meist werden typed Event-Channels oder die gemischten Push/Pull-Modelle nicht implementiert. Darüber hinaus sieht die Event-Service Spezifikation keine Event-Channel Factory vor. Das bedeutet, dass die Erzeugung der Event-Channels über ORB-spezifische Konfiguration geschieht.

Da ein Event-Channel meist an einen Supplier gebunden ist, kann es sinnvoll sein, die Event-Channel Implementierung fest zu diesem Programm zu linken, um Kommunikationsoverhead zu sparen. Dies setzt natürlich voraus, dass Event-Server und Programm die selbe CORBA-Implementierung verwenden und dass entsprechende Libraries zur Verfügung gestellt werden.

Typed Event-Service

Die Implementierung eines typed Event-Service ist wesentlich komplizierter und umfangreicher als die eines untyped Event-Service, da das Interface des typed Event-Service erst zur Laufzeit (des Event-Service) feststeht. Daher muss die Implementierung auf das Interface Repository zurückgreifen, um die notwendigen Interface-Informationen zu erhalten. Weiters ist der Einsatz des Dynamic Skeleton Interfaces notwendig, um eingehende Requests dynamisch anhand der Interface-Informationen zu parsen. Zu guter letzt kommt auch noch das Dynamic Invocation Interface zum Einsatz, um Push-Requests für die Consumer zusammenzubauen.

Die Verwendung des typed Event-Service ist dafür umso einfacher. Es ist dazu lediglich notwendig, das Event-Interface zu definieren und dem Client Zugriff auf den TypedConsumerAdmin zu geben.

Beispiel 3. Interfaces für einen typed Event-Service

interface App
{
  CosTypedEventChannelAdmin::TypedConsumerAdmin
    getMyEventConsumerAdmin();
};

interface MyEvent
{
  void myEvent(in string eventName, in any txInfo, in any eventInfo);
};

interface TypedMyEvent
  : MyEvent, CosEventComm::PushConsumer
{
};

Im Server muss dem Event-Channel nur noch seine Repository-Id mitgeteilt werden.

Beispiel 4. Initialisierung des Event-Channels

// typedEventChan ist bereits mit der Referenz auf den Event-Channel
// (TypedEventChannel) initialisier

CosTypedEventChannelAdmin::TypedSupplierAdmin_var supplierAdmin =
  typedEventChan->for_suppliers();

// diese Referenz wird dem Client zur Verfuegung gestellt
myEventConsumerAdmin = typedEventChan->for_consumers();


CosTypedEventChannelAdmin::TypedProxyPushConsumer_var consumer =
  supplierAdmin->obtain_typed_push_consumer("IDL:MyEvent:1.0");

CORBA::Object_ptr typedConsumer = consumer->get_typed_consumer();

// diese Referenz wird im Server verwendet, um Events zu erzeugen
myEvent = MyEvent::_narrow(typedConsumer);

Notification-Service

Für manche Einsatzbereiche bietet der Event-Service noch zu wenig Funktionalität, weil er kein Filtern von Events erlaubt oder auch keine Aussage über die Qualität des Dienstes (Quality of Service) zuläßt. Dies versucht der Notification-Service zu beheben, wobei er vor allem zur Filterung sogenannte structured events einführt, die sich wegen einer fest vorgegebenen Struktur im Event-Service einfacher filtern lassen. Der Notification-Service ist im Dokument [18] spezifiziert.

CORBA Messaging

In dem Bereich Events, Callback, ... gibt es noch eine weitere Spezifikation: CORBA Messaging. Diese Spezifikation deckt 3 Bereiche ab:

CORBA Messaging ist im Dokument [19] spezifiziert.

Fußnoten

[1]

Unmittelbar nach dem Aufruf erhält der Client sofort wieder die Kontrolle zurück und er kann das Ergebnis zu einem späteren Zeitpunkt auswerten.