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.