Nachfolgend sehen Sie die Advisor-Beispieldatei "ADV_sample".
/ * * * ADV_sample: HTTP-Avisor für Load Balancer * * * Diese Klasse definiert eine angepasste Beispiel-Advisor-Funktion für Load Balancer. * Diese angepasste Advisor-Funktion erweitert wie alle anderen Advisor-Funktionen den Advisor-Basiscode * ADV_Base. Es ist der Advisor-Basiscode, 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 Advisor-Basiscode Socket-Verbindungen her, schließt Sockets und * stellt Sende- und Empfangsmethoden für die Advisor-Funktion bereit. Die * Advisor-Funktion 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 Advisor-Basiscodes 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, von der * Advisor-Funktion zurückgegebenen Last überschrieben werden. * * Anmerkung: Der Advisor-Basiscode stellt in angegebenen Intervallen * die Last ausgehend von einem in der Methode "constructor" gesetzten Wert * für den Wertigkeitsalgorithmus bereit. Wenn die eigentliche Advisor-Funktion * noch keine gültige Last zurückgeben kann, verwendet der Advisor-Basiscode * die vorherige Last. * * NAMEN * * Die Namenskonvention ist wie folgt: * * - Die Datei muss sich im folgenden Load-Balancer-Verzeichnis befinden: * * ulb/servers/lib/CustomAdvisors/ (ulb\servers\lib\CustomAdvisors unter Windows) * * - Der Advisor-Name muss das Präfix "ADV_" haben. Zum Starten * der Advisor-Funktion genügt jedoch der Name. Die Advisor-Funktion * ADV_sample kann beispielsweise mit sample gestartet werden. * * - Der Name der Advisor-Funktion muss in Kleinbuchstaben angegeben werden. * * Basierend auf diesen Regeln wird deshalb wie folgt auf das Beispiel verwiesen: * * <base directory="">/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 (Konstruktor): * * - Parmeter * - String sName = Name des Advisors * - String sVersion = Version des Advisors * - int iDefaultPort = Standardport, über den Empfehlungen ausgegeben werden * - int iInterval = Intervall, in dem Empfehlungen zu den Servern ausgegeben werden sollen * - String sDefaultName = Nicht verwendet. Muss als leere Zeichenfolge ("") übergeben werden. * - boolean replace = True - Den vom Advisor-Basiscode berechneten Lastwert * ersetzen * False - Zu dem vom Advisor-Basiscode berechneten Lastwert * addieren * - Return * - Konstruktoren haben keine Rückgabewerte. * * Da der Advisor-Basiscode auf Threads basiert, stehen verschiedene andere * Methoden für Advisor-Funktionen zur Verfügung. Auf diese kann mit dem von * getLoad() übergebenen Parameter CALLER verwiesen werden. * * Diese Methoden sind wie folgt: * * - send - Informationspaket über die eingerichtete Socket-Verbindung * an den Server am angegebenen Port senden. * - Parameter * - String sDataString - Die zu sendenden Daten in Form einer Zeichenfolge * - Rückgabewert * - int RC - Gibt an, ob die Daten erfolgreich gesendet wurden oder nicht: Null gibt an, dass die Daten gesendet wurde. Ein negativer * Wert 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ückgabewert * - int RC - Gibt an, ob die Daten erfolgreich empfangen wurden oder nicht: Null gibt an, dass Daten empfangen wurden. Eine negative ganze * Zahl zeigt einen Fehler an. * * Falls die vom Advisor-Basiscode bereitgestellte Funktionalität nicht * ausreicht, können Sie die gewünschte Funktion innerhalb des Advisors * erstellen. Die vom Advisor-Basiscode bereitgestellten Methoden werden * dann ignoriert. * * Eine wichtige Frage hinsichtlich der zurückgegebenen Last ist, ob * sie auf die vom Advisor-Basiscode generierte Last angewendet oder * diese ersetzen soll. Es gibt gültige Instanzen für beide Situationen. * * Dieses sehr einfache Beispiel entspricht im Wesentlichen der * HTTP-Advisor-Funktion von Load Balancer. * Es wird eine Sendeanforderung (HTTP HEAD) abgesetzt. Beim Empfang einer * Antwort wird die Methode "getLoad" beendet und der Advisor-Basiscode * 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, All Rights Reserved.\n"; 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"; /** * Konstruktor. * * Parameter: Keine. An die Methode "constructor 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 ); } /** * Eine Advisor-spezifische Initialisierung, die nach dem Start der * Advisor-Funktion stattfinden muss. Diese Methode wird nur einmal aufgerufen * und in der Regel nicht verwendet. */ public void ADV_AdvisorInitialize() { return; } /** * getLoad() * * Diese Methode wird vom Advisor-Basiscode aufgerufen, um die Operation der * Advisor-Funktion 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 Advisor-Basisklasse, 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 entsprechend dem * Flag "replace" der Methode "constructor" 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 * ausfallen. * * Wenn der Wert negativ ist, wird von einem Fehler ausgegangen. Ein Fehler * von einer Advisor-Funktion zeigt an, dass der Server, den die * Advisor-Funktion zu erreichen versucht, nicht zugänglich und inaktiv ist. * Load Balancer versucht nicht, einen inaktiven Server am Lastausgleich zu * beteiligen. Der Server wird erst 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 // Send tcp request iRc = caller.send(ADV_SEND_REQUEST); if (iRc >= 0) { // receive (Empfang) ausführen StringBuffer sbReceiveData = new StringBuffer(""); iRc = caller.receive(sbReceiveData); /** * Im normalen Advisor-Modus (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 der Basis-Advisor-Funktion 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 - ADV_sample