In diesem Kapitel soll die Implementierung der Anbindung des Agenten an den Event Channel betrachtet werden. Dazu ist es nötig, auf das Prinzip der Anbindung an den Event Channel näher einzugehen.
Wird ein Event Channel zum ersten Mal erzeugt, besitzt er weder Supplier noch Consumer. Diese beiden führen folgende Schritte aus, um sich an den Event Channel zu binden bzw. mit diesem zu kommunizieren:
Im Falle des PC-basierten Switch wird das üblichere Verfahren (nach [Vis97c]) des Push-Modells angewendet. Das Pull-Modell soll hier nicht betrachtet werden, da das Push-Modell sich für das Verschicken von Ereignismeldungen besser eignet. Hierzu muß das Agentenobjekt das PushSupplier-Interface implementieren. Der Manager implementiert entsprechend das PushConsumer-Interface. Die für den Agenten nötigen Schritte sind in Tabelle 5.1 dargestellt.
Schritt | Push Supplier |
---|---|
Binden an den Event Channel | EventChannelHelper::bind() |
Referenz auf das Proxy Objekt | EventChannel::for_suppliers() |
Consumer Proxy anfordern | SupplierAdmin::obtain_push_consumer() |
Supplier an den Proxy binden | ProxyPushConsumer::connect_push_supplier() |
Daten verschicken | ProxyPushConsumer::push |
Für den Prototypen wurde eine Klasse eventPushSupplier.java geschrieben. Diese greift die Information, die der Switch über die netlink-Schnittstelle des Linux-Kernels an einen externen Dämonen (brd) weiterleitet und von diesem auf <stderr> ausgegeben wird, auf und schickt sie dann an einen vorher definierten Event Channel. Der Name dieses Event Channels wird im Feld event_channel_name des in Kapitel 4.5 geschilderten structured events übergeben.
Der Event Channel wird vom Eventprogramm des Agenten (eventPushSupplier.java) erzeugt und beim BOA angemeldet.
124 // Initialize the ORB and BOA 125 org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(); 126 org.omg.CORBA.BOA boa = orb.BOA_init();
Das Eventprogramm erbt von der Klasse _PushSupplierImplBase. Nach der Initialisierung des ORB und BOA erzeugt es einen Event Channel (create_channel()):
128 // Create the channel 129 EventChannel channel = EventLibrary.create_channel(boa, 130 "AgentInitChannel", 131 false, 132 100);
Anschließend fordert es einen ProxyPushConsumer an (obtain_push_consumer()). Um den PushSupplier des Agenten mit dem Proxy-Objekt im Event Channel zu verbinden, führt der Agent einen connect aus (connect_push_supplier()).
133 // Create the proxy-consumer 134 ProxyPushConsumer proxyPushConsumer = 135 channel.for_suppliers().obtain_push_consumer(); 136 137 // Connect a supplier to proxy-consumer 138 eventPushSupplier supplier = new eventPushSupplier(channel, 139 proxyPushConsumer); [...] 146 try { 147 proxyPushConsumer.connect_push_supplier(supplier); 148 }
Durch Aufruf der Methode push() auf dem Proxy-Objekt ist der Agent nun in der Lage Statusmeldungen in den Event Channel zu pushen.
202 // Push message in the channel 203 System.out.println("Supplier pushing: "+any.toString()); 204 try { 205 proxyPushConsumer.push(any); 206 }
Der VisiBroker Event Service unterstützt momentan lediglich generische Ereignismeldungen. Daher müssen die Daten, die in den Event Channel gepusht werden, zwingend als CORBA Any-Datentyp verpackt werden (Vorgabe des EventChannel-Interfaces). Überdies gibt es keine garantierte Datenübertragung. Die Datensicherheit stützt sich allein auf die Sicherheitsmechanismen von TCP/IP, welches zur Kommunikation zwischen Sender und Empfänger zur Anwendung kommt.
Der Vorgang für das Versenden der Ereignismeldungen des Switch gleicht dem bisher beschriebenen. Zunächst werden der BOA und der ORB initialisiert und ein neuer Event Channel mit dem Namen PCSwitch kreiert. Anschließend wird ein ProxyPushConsumer angefordert (obtain_push_consumer()). Um den PushSupplier des Agenten mit dem Proxy-Objekt im Event Channel zu verbinden, führt der Agent einen connect aus (connect_push_supplier()).
228 // Create the proxy-consumer 229 ProxyPushConsumer myproxyPushConsumer = 230 myEventChannel.for_suppliers().obtain_push_consumer(); 231 232 // Instantiiere neues Objekt 233 myEventPushSupplier = new eventPushSupplier(myEventChannel, 234 myproxyPushConsumer); [...] 243 try { 244 myEventPushSupplier.myproxyPushConsumer. 245 connect_push_supplier(myEventPushSupplier); 246 }
Dabei ist eventPushSupplier() die Konstruktormethode. Dieser werden die Referenz auf den Event Channel und dem proxyPushConsumer übergeben, damit diese beiden Attribute später in den Event Channel gepusht werden können:
295 myEventPushSupplier.push_event( port, mac);
Die Methode push_event() konstruiert den nötigen structured event. Der Aufbau dieses Events für die Übermittlung der Port- und MAC-Adresse an den Manager zeigt Abbildung 5.4.
Der Fixed Header besteht aus dem Eintrag systemmanagement und dem Namen des Eventtyps (newsystem). Der Filterable Body sieht die Felder für den agent_type, agent_name und den event_channel_name vor, die mit den gleichen Werten wie in Kapitel 4.5 belegt werden. Anschließend folgen die Felder port_id und mac_address, die die Portadresse und die MAC-Adresse aufnehmen.