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