Wie in Abschnitt 2.3.3 beschrieben, ist es
notwendig, zur Überwachung von Service-Level-Agreements
Antwortzeiten aus Benutzersicht zu messen. Durch eine
Agentenarchitektur wird diese Anforderung erfüllt, da so die Messung
aus der Händlerlokation getätigt wird. Implementiert wurde im
Prototypen ein einfaches, auf dem Internetwerkzeug ping
und ICMP (Internet Control Message Protocol) basierendes Verfahren
zur Prüfung der Verfügbarkeit eines IP-Hosts und Messung seiner
Antwortzeit.
Ziel der Realisierung auf der Agentenseite ist, den
Implementierungsaufwand für neue Meßmethoden möglichst gering zu
halten. Daher wurde eine Architektur gewählt, die eine abstrakte
Klasse AgMeasurement mit allen für eine intervallgesteuerte
Messung benötigten Funktionalitäten bereitstellt. Die
eigentlich Meßmethode, also performMeasure, wurde
abstrakt gehalten. Die Umsetzung dieser Methode geschieht in der
Klasse AgConnectivity.
public void propertyChange(PropertyChangeEvent e){ alarmClock.performStart(); }In dem erstem Intervall werden keine Messungen durchgeführt, da hier die Ressourcen für Benutzerdaten freigehalten werden müssen. Während der Initialisierung der Messung werden die IP-Adressen der Hosts aus der Konfigurationsschnittstelle GlobalVariables des Agenten ausgelesen und eine neues Objekt der Klasse DataObject zur Verwaltung der messungsrelevanten Daten erzeugt:
Vector adressen = AgBasis.globalVariables.gethostsToBeChecked(); DataObject cdo = new DataObject(now , true, getownIPAdress(), false, "Connectivity&ResponseTimeWithPing", adressen, getownIPAdress());Nun wird anhand des Adressenvektors adressen eine Erreichbarkeitsanalyse mit dem Internetwerkzeug ping, also mit ICMP-Echo-Paketen, durchgeführt. Vorteil einer solchen Realisierung ist, daß dieser Mechanismus als Standard überall verfügbar ist. Auf praktisch jeder aktiven Netzkomponenten ist ein Port festgelegt, an das dieses Werkzeug Pakete senden kann, und die dann zurückgeschickt werden.
// Rahmen fuer den PingProzess Process pingproc; Runtime runtime = Runtime.getRuntime();In der darauffolgenden Meßsequenz wird nun pro IP-Adresse eine Anfangszeit aus dem System ausgelesen, der Ping-Prozeß ausgeführt, und mit Hilfe der Endzeit die Prozeßdauer in Millisekunden berechnet.
// Pingsequenz for (int i=0; i<anzahl; i++){ String adresse = (String)adressen.elementAt(i); try{ // Startzeit long begin = System.currentTimeMillis(); pingproc = runtime.exec("ping "+ adresse); // hier kann eine Maximale Wartezeit ergaenzt werden pingproc.waitFor(); // Endzeit long end=System.currentTimeMillis(); // benoetigte Zeit Integer result = new Integer((int)end-(int)begin); // wurde Ping erfolgreich durchgefuehrt ?? if (pingproc.exitValue()==0) results.addElement(result); else results.addElement(new Integer(-1)); // -1 bedeutet Host nicht erreichbar } catch(Exception e){ e.printStackTrace(); cdo.setresults(results); } }Der Rückgabe-Wert signalisiert, ob die Messung erfolgreich war oder nicht. Abschließend wird das Ergebnis dem DataObject übergeben und dieser an den DataHandler weitergereicht.
cdo.setresults(results); AgBasis.dataHandler.addDataObject(cdo); alarmClock.setTimeoutAsLong(AgBasis.globalVariables.getcheckFrequence()); alarmClock.performStart();Das erneute Setzen der CheckFrequenz gewährleistet eine sofortige Reaktion auf eine Änderung der Agenten-Konfiguration.