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.
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); |
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.
In dem Bereich Events, Callback, ... gibt es noch eine weitere Spezifikation: CORBA Messaging. Diese Spezifikation deckt 3 Bereiche ab:
Asynchronous Method Invocation (AMI)
CORBA spezifiziert nur synchrone Aufrufe und mit Hilfe des Dynamic Invocation Interfaces gibt es die Möglichkeit, deferred synchronous [1] Aufrufe zu implementieren
Durch AMI erhält der Client ohne den Umweg über das Dynamic Invocation Interface die Möglichkeit für einen asynchronen Aufruf, wobei das Ergebnis entweder über Callback oder über Polling zur Verfügung gestellt wird.
AMI wird rein clientseitig implementiert, sodass ein CORBA-Server weder Unterstützung für asynchrone Aufrufe bieten muss noch merkt er überhaupt etwas davon, dass ein Methodenaufruf asynchron am Client ausgeführt wird.
Time Independant Invocation (TII)
Messaging Quality of Service
CORBA Messaging ist im Dokument [19] spezifiziert.
[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. |