5.2 Die Schnittstellenkomponente
Die Aufgaben und die grundlegenden Funktionalitäten einer Schnittstellenkomponente
wurden bereits in Kapitel 3.4.2 beschrieben. Dieser Abschnitt beschäftigt sich mit der
Realisierung der Schnittstellenkomponente.
Die realisierte Schnittstellenkomponente wird über eine Konfigurationsdatei
parametrisiert. In Tabelle 5.1 sind die Parameter und ihre Bedeutung zusammengefaßt.
|
|
| Parameter | Argumente | Bedeutung |
|
|
| RECEIVE_PORT | <port> | Portadresse, unter der die Schnitt- |
| | stellenkomponente auf Aufträge wartet |
|
|
| BROKER_ADDRESS | <host>,<port> | Die Connectadresse des Brokers |
|
|
| MAP_MODULE | <filtermodule> | Pythonmodul, das die |
| | Filterroutinen bereitstellt |
|
|
| MAP_COMMAND | <command>, | Zuordnung der Kommandos |
| <filterfunction> | zu den Filterroutinen |
|
|
| MAX_ORDERS | <maxorders> | maximale Anzahl der offenen Aufträge |
| | der Schnittstellenkomponente |
|
|
| LOGFILE | <logfilename> | Dateiname der LOG-Datei |
|
|
| |
Tabelle 5.1: | Parameter der Schnittstellenkomponente |
|
Von besonderem Interesse sind die Parameter MAP_MODUL und MAP_COMMAND.
Durch sie wird festgelegt, in welchem Pythonmodul die Filterroutinen definiert sind und
welches Kommando durch welche Funktion gefiltert wird. Dabei wird der
gesamte Auftrag als Parameter an die Funktion übergeben. Der Rückgabewert der
Filterfunktion entspricht dem konvertierten Auftrag. Diese Filterroutinen können
ebenfalls für die Rückgabewerte von Speicher bzw. Broker festgelegt werden. Die
Funktionsweise der Schnittstellenkomponente wird in Abbildung 5.1 verdeutlicht.
Eingehende Aufträge werden derart konvertiert, daß sie dem internen Protokoll des
Speichersystems entsprechen.
Die an den Broker gesendeten Aufträge entsprechen einem der folgenden Formate:
- PUT <metadocument> <methodname> <methodparameters>
- ACTIVATE <docid> <methodname> <methodparameters>
- INFO
Die Rückmeldungen, die der Schnittstellenkomponente vom Broker übergeben werden,
können folgende Gestalt annehmen:
- RESULT <docid> <result>
- ERROR <errorcode> <errormessage>
Bei Ausfall des Brokers und damit bei Unterbrechung der Verbindungen sendet
die Schnittstellenkomponente eine Fehlermeldung an die auftraggebenden
Instanzen.
5.2.1 Die Netzverbindungsklasse
Da sowohl der Broker als auch die Schnittstellenkomponenten
eine Reihe von Netzverbindungen und damit Sockets parallel überwachen
müssen, wurde für diese Aufgabe eine eigene Klasse implementiert. Die Klasse
c_multiconn (multible connections) erzeugt, überwacht und verwaltet eine Menge von
TCP/IP-Sockets der Internet-Domäne und unterstützt alle gängigen Socketoperationen.
Die Identifikation der einzelnen Sockets innerhalb der Socketmenge erfolgt über den
eindeutig zugeordneten Socketdeskriptor. So liefert beispielsweise die Methode
open_sock, die einen neuen Socket erzeugt, den korrespondierenden Socketdeskriptor
zurück. Unter Angabe des Socketdeskriptors können dann weitere Operationen (z.B.
lesen, schreiben, schließen) auf dem Socket ausgeführt werden. Als besonders nützlich
erwies sich die Methode wait_event. Sie ermittelt unter Benutzung der Python
select-Klasse alle Sockets, die innerhalb eines gegebenen Zeitraums aktiv sind und liefert
eine Liste der zugehörigen Socketdeskriptoren zurück. Anhand der Deskriptoren und
der Benutzung der Methoden accept und sock_read können die Ereignisse abgearbeitet
werden. Eine Gesamtübersicht der implementierten Methoden dieser Klasse zeigt
Tabelle 5.2.
|
|
| Methode | Parameter | Funktionalität |
|
|
| Konstruktor | - | Initialisiert interne Variable. |
|
|
| Destruktor | - | Löscht interne Variable. |
|
|
| open_sock | <host>,<port> | Erzeugt einen Socket und bindet ihn |
| | an die übergebene Adresse. |
|
|
| close_sock | <socketnr> | Schließt den Socket, |
| | mit der übergebenen Socketnummer. |
|
|
| wait_event | <seconds> | Wartet <seconds> Sekunden auf |
| | Ereignisse an allen in der Socketmenge |
| | befindlichen Sockets. Für seconds=0 |
| | wird solange gewartet bis ein Ereignis eintritt. |
|
|
| write_sock | <socketnr>, | Schreibt <message> auf den Socket, mit |
| <message> | der Nummer <socketnr>. |
|
|
| read_sock | <socketnr> | Liest vom Socket <socketnr> und liefert |
| | als Ergebnis, die gelesene Nachricht zurück. |
|
|
| poll_sock | <socketnr>, | Wartet <seconds> Sekunden an Socketnummer |
| <seconds> | <socketnr> auf eine Nachricht. |
|
|
| connect | <socketnr>, | Verbindet Socket <socketnr> mit der durch |
| <host>,<port> | <host>,<port> angegebenen Adresse. |
|
|
| accept | <socketnr> | Führt einen Accept an Socketnummer |
| | <socketnr> aus und liefert als Ergebnis |
| | den neuen Verbindungssocket zurück. |
|
|
| get_localaddr | <socketnr> | Gibt die lokale Adresse des Sockets zurück |
|
|
| |
Tabelle 5.2: | Methoden der Klasse c_multiconn |
|