Nachfolgend sehen Sie die Advisorbeispieldatei "ADV_sample".
/ * * * ADV_sample: HTTP-Avisor für Load Balancer * * * Diese Klasse definiert einen angepassten Beispieladvisor für Load Balancer. Dieser * angepasste Advisor erweitert wie alle anderen Advisor den Advisorbasiscode * ADV_Base. Es ist der Advisorbasiscode, der die meisten Funktionen ausführt. * Dazu gehört das Zurückmelden von Belastungen an Load Balancer, die für den * Wertigkeitsalgorithmus von Load Balancer verwendet werden. Darüber hinaus * stellt der Advisorbasiscode Socket-Verbindungen her, schließt Sockets und * stellt Sende- und Empfangsmethoden für den Advisor bereit. Der Advisor * selbst wird nur zum Senden von Daten an den Port bzw. Empfangen von Daten * vom Port des empfohlenen Servers verwendet. Die TCP-Methoden innerhalb * des Advisorbasiscodes sind zeitlich gesteuert, um die Last zu berechnen. * Mit einem Flag der Methode "constructor" in * "ADV_base" kann bei Bedarf * die vorhandene Last mit der neuen, vom Advisor zurückgegebenen Last * überschrieben werden. * * Anmerkung: Der Advisorbasiscode stellt in angegebenen Intervallen * die Last ausgehend von einem in der Methode constructor festgelegten * Wert für den Wertigkeitsalgorithmus bereit. Ist der eigentliche * Advisor noch abgeschlossen, so dass sie keinen gültigen * Lastwert zurückgegeben kann, verwendet der Advisorbasiscode die * bisherige Last. * * NAMEN * * Es gilt die folgende Namenskonvention: * * - Die Datei muss sich im folgenden Load-Balancer-Verzeichnis befinden: * * ulb/servers/lib/CustomAdvisors/ (ulb\servers\lib\CustomAdvisors unter Windows) * * - Der Name des Advisors muss das Präfix ADV_ haben. Zum Starten * des Advisors genügt jedoch der Name. Der Advisor * ADV_sample kann beispielsweise mit sample gestartet werden. * * - Der Name des Advisors muss in Kleinbuchstaben angegeben werden. * * Unter Beachtung dieser Regeln wird auf dieses Beispiel wie folgt verwiesen: * * <Basisverzeichnis="">/lib/CustomAdvisors/ADV_sample.class * * * Advisor müssen wie der Rest von Load Balancer mit der vorausgesetzten Version * von Java kompiliert werden. Um den Zugriff auf die Load-Balancer-Klassen zu * gewährleisten, müssen Sie sicherstellen, dass die Datei "ibmlb.jar" (aus dem * Unterverzeichnis "lib" des Basisverzeichnisses) im CLASSPATH des Systems enthalten ist. * * Von ADV_Base bereitgestellte Methoden: * * - ADV_Base (Constructor): * * - Parameter * - String sName = Name des Advisors * - String sVersion = Version des Advisors * - int iDefaultPort = Standardportnummer für den Advisor * - int iInterval = Intervall für die Ausführung des Advisors * auf den Servern * - String sDefaultName = Unused. Muss als leere Zeichenfolge ("") übergeben werden. * - boolean replace = True - Den vom Advisorbasiscode berechneten Lastwert * ersetzen * False - Zu dem vom Advisorbasiscode berechneten Lastwert * addieren * - Rückgabe * - constructor-Methoden haben keine Rückgabewerte. * * Da der Advisorbasiscode auf Threads basiert, stehen verschiedene andere * Methoden für Advisor zur Verfügung. Auf diese kann mit dem von * getLoad() übergebenen Parameter CALLER verwiesen werden. * * Es handelt sich um die folgenden Methoden: * * - send - Informationspaket über die eingerichtete Socket-Verbindung * an den Server am angegebenen Port senden. * - Parameter * - String sDataString - Daten werden in Form einer Zeichenfolge * gesendet * - Rückgabe * - int RC - Null gibt unabhängig vom erfolgreichen/gescheiterten Senden * der Daten an, dass die Daten gesendet wurden. Eine negative * ganze Zahl zeigt einen Fehler an. * * - receive - Empfang von Informationen von der Socket-Verbindung. * - Parameter * - StringBuffer sbDataBuffer - Die während des Aufrufs von receive * empfangenen Daten * - Rückgabe * - int RC - Gibt an, ob die Daten erfolgreich empfangen wurden. * Null gibt an, dass die Daten empangen wurden. Eine negative * ganze Zahl zeigt einen Fehler an. * * Falls die vom Advisorbasiscode bereitgestellte Funktionalität nicht * ausreicht, können Sie die gewünschte Funktion innerhalb des Advisors * erstellen. Die vom Advisorbasiscode bereitgestellten Methoden werden * dann ignoriert. * * Eine wichtige Frage hinsichtlich der zurückgegebenen Last ist, ob * sie auf die vom Advisorbasiscode generierte Last angewendet oder * diese ersetzen soll. Es gibt gültige Instanzen für beide Situationen. * * Dieses Beispiel entspricht im Wesentlichen dem HTTP-Advisor von Load Balancer. * Es wird eine Sendeanforderung (http head) abgesetzt. Beim Empfang einer * Antwort wird die Methode getLoad beendet und der Advisorbasiscode wird dazu * angewiesen, die Ablaufsteuerung der Anforderung zu stoppen. Die Methode * ist damit abgeschlossen. Die zurückgegebenen Informationen werden keiner * Syntaxanalyse unterzogen. Die Last basiert auf der für das Senden und * Empfangen benötigten Zeit. */ package CustomAdvisors; import com.ibm.internet.nd.advisors.*; public class ADV_sample extends ADV_Base implements ADV_MethodInterface { String COPYRIGHT = "(C) Copyright IBM Corporation 1997. Alle Rechte vorbehalten. static final String ADV_NAME = "Sample"; static final int ADV_DEF_ADV_ON_PORT = 80; static final int ADV_DEF_INTERVAL = 7; // Anmerkung: Die meisten Serverprotokolle erfordern am Ende von Nachrichten // eine Zeilenschaltung ("\r") und einen Zeilenvorschub ("\n"). Sollte dies // für Sie zutreffen, nehmen Sie sie an dieser Stelle in Ihre Zeichenfolge // auf. static final String ADV_SEND_REQUEST = "HEAD / HTTP/1.0\r\nAccept: */*\r\nUser-Agent: " + "IBM_Load_Balancer_HTTP_Advisor\r\n\r\n"; /** * Constructor. * * Parameter: Keine. An die constructor-Methode für ADV_Base müssen * jedoch mehrere Parameter übergeben werden. * */ public ADV_sample() { super( ADV_NAME, "2.0.0.0-03.27.98", ADV_DEF_ADV_ON_PORT, ADV_DEF_INTERVAL, "", // not used false); super.setAdvisor( this ); } /** * ADV_AdvisorInitialize * * Eine advisorspezifische Initialisierung, die nach dem Start des * Advisors stattfinden muss. Diese Methode wird nur einmal aufgerufen * und in der Regel nicht verwendet. */ public void ADV_AdvisorInitialize() { return; } /** * getLoad() * * Diese Methode wird vom Advisorbasiscode aufgerufen, um die Operation des * Advisors auf der Grundlage protokollspezifischer Details zu beenden. * In diesem Beispiel sind nur eine Sende- und eine Empfangsoperation * notwendig. Wenn eine komplexere Logik erforderlich ist, können mehrere * Sende- und Empfangsoperationen ausgeführt werden. * Es könnte beispielsweise eine Antwort empfangen werden. Die sich aus der * Syntaxanalyse dieser Antwort ergebenden Informationen könnten eine * weitere Sende- und Empfangsoperation nach sich ziehen. * * Parameter: * * - iConnectTime - Derzeitige Last entsprechend der Zeit, die für das Herstellen * der Verbindung zum Server über den angegebenen Port benötigt * wurde. * * - caller - Verweis auf die Advisorbasisklasse, wo die von Load * Balancer bereitgestellten Methoden einfache TCP-Anforderungen * wie Sende- und Empfangsaufrufe durchführen sollen. * * Ergebnisse: * * - Last: Ein in Millisekunden angegebener Wert, der je nach Einstellung * des Flas replace der constructor-Methode zur vorhandenen Last * addiert wird oder die vorhandene Last ersetzt. * * Je größer die Last ist, desto länger benötigte der Server für die * Antwort. Um so geringer wird auch die Wertigkeit im Load Balancer * ausfallen. * * Wenn der Wert negativ ist, wird von einem Fehler ausgegangen. Ein Fehler von * einem Advisor weist darauf hin, dass der Server, den der Advisor zu erreichen * versucht, nicht zugänglich und inaktiv ist. Load Balancer versucht nicht, * einen inaktiven Server am Lastausgleich zu beteiligen. Der Server wird erst * dann wieder in den Lastausgleich einbezogen, wenn ein positiver Wert empfangen wird. * */ public int getLoad(int iConnectTime, ADV_Thread caller) { int iRc; int iLoad = ADV_HOST_INACCESSIBLE; // -1 // tcp-Anforderung senden iRc = caller.send(ADV_SEND_REQUEST); if (iRc >= 0) { // Empfang ausführen StringBuffer sbReceiveData = new StringBuffer(""); iRc = caller.receive(sbReceiveData); /** * Im normalen Advisormodus (Flag replace ist auf false gesetzt), * wird der Lastwert 0 oder 1 zurückgegeben, um anzugeben, ob der Server * aktiv oder inaktiv ist. * Bei erfolgreichem Empfang wird als Lastwert null zurückgegeben, um * anzuzeigen, dass der von vom Basisadvisor ermittelte * Lastwert verwendet werden soll. * * Andernfalls (Flag "replace" ist auf true gesetzt) müssen Sie * den gewünschten Lastwert zurückgeben. */ if (iRc >= 0) { iLoad = 0; } } return iLoad; } } // Ende von ADV_sample