Anhang C. Beispielkonfigurationsdateien

Dieser Anhang enthält Beispielkonfigurationsdateien für die Komponente Dispatcher von Load Balancer.

Beispielkonfigurationsdateien für Load Balancer

Die Beispieldateien befinden sich im folgenden Verzeichnis:

Dispatcher-Konfigurationsdatei — AIX-, Linux- und Solaris-Systeme

#!/bin/bash
#
# configuration.sample - Beispielkonfigurationsdatei für die
# Komponente Dispatcher
#
#
# Dieses Script muss von Root ausgeführt werden.
#
# iam=`wer bin ich`
 
# if [ "$iam" != "root" ]if [ "$iam" != "root" ]
#  then 
#  echo "Sie müssen sich zum Ausführen dieses Scripts als Root anmelden"
#   exit 2
# fi 

#
# Starten Sie zunächst den Server
#
# dsserver start
# sleep 5

#
# Starten Sie dann den Executor.
#
# dscontrol executor start

#
# Der Dispatcher kann vor dem Löschen der Dispatcher-Software
# jederzeit mit den Befehlen dscontrol executor stop und
# dsserver stop zum Stoppen von Executor und Server entfernt
# werden.
#
# Der nächste Konfigurationsschritt für den Dispatcher ist das
# Festlegen der NFA und der Clusteradresse(n).
#
# Die NFA wird für den Fernzugriff auf die Dispatcher-Maschine
# zu Verwaltungs- oder Konfigurationszwecken verwendet. Diese
# Adresse ist erforderlich, da der Dispatcher Pakete an die
# Clusteradresse(n) weiterleitet.
# 
# Die CLUSTER-Adresse ist der Hostname (oder die IP-Adresse)
# zu dem (bzw. zu der) ferne Clients eine Verbindung herstellen.
#
# Hostnamen und IP-Adressen sind an jeder Stelle dieser
# Datei beliebig gegeneinander austauschbar.
#

# NFA=Hostname.Domäne.Name
# CLUSTER=www.IhreFirma.com

# echo "NFA wird geladen"
# dscontrol executor set nfa $NFA

#
# Der nächste Konfigurationsschritt für den Dispatcher ist
# das Erstellen eines Clusters. Der Dispatcher leitet an die
# Clusteradresse gesendete Anforderungen an die entsprechenden,
# für diesen Cluster definierten Servermaschinen weiter. Mit
# Dispatcher können Sie mehrere Clusteradressen konfigurieren
# und bedienen.

# Verwenden Sie für CLUSTER2, CLUSTER3 usw. eine ähnliche Konfiguration.
#

# echo "Erste CLUSTER-Adresse wird geladen"
# dscontrol cluster add $CLUSTER

#
# Jetzt müssen die Ports definiert werden, die dieser Cluster
# verwendet. Alle vom Dispatcher an einem definierten Port
# empfangenen Anforderungen werden an den entsprechenden Port
# einer der Servermaschinen weitergeleitet.
#

# echo "Ports für CLUSTER $CLUSTER werden erstellt"

# dscontrol port add $CLUSTER:20+21+80

#
# Der letzte Schritt ist das Hinzufügen der einzelnen Servermaschinen
# zu den Ports dieses Clusters.
# Auch hier können Sie entweder den Hostnamen oder die IP-Adresse der
# Servermaschinen verwenden.
#

# SERVER1=Servername1.Domäne.Name
# SERVER2=Servername2.Domäne.Name
# SERVER3=Servername3.Domäne.Name

# echo "Servermaschinen werden hinzugefügt"
# dscontrol server add $CLUSTER:20+21+80:
# $SERVER1+$SERVER2+$SERVER3

#
# Jetzt werden die Lastausgleichskomponenten von Dispatcher
# gestartet. Die Hauptkomponente ist der Manager.
# Die sekundären Komponenten sind die Advisor. Sind
# Manager und Advisor nicht aktiv, sendet der
# Dispatcher Anforderungen in einem RoundRobin-Format.
# Sobald der Manager gestartet ist, werden Gewichtungsentscheidungen
# auf der Grundlage der Anzahl neuer und aktiver Verbindungen
# getroffen und eingehende Anforderungen an den am besten geeigneten
# Server gesendet. Die Advisor geben dem Manager
# Einblick in die Fähigkeit eines Servers, Anforderungen zu bedienen,
# und können feststellen, ob ein Server aktiv ist. Erkennt ein
# Advisor, dass ein Server inaktiv ist, wird dieser
# entsprechend markiert (sofern die Managerproportionen so
# festgelegt wurden, dass die Eingabe vom Advisor einbezogen wird)
# und es werden keine weiteren Anforderungen an den Server weitergeleitet.

# Der letzte Schritt beim Konfigurieren der Lastausgleichskomponenten
# ist das Festlegen der Managerproportionen. Der Manager aktualisiert
# die Wertigkeit der Server ausgehend von vier verschiedenen Ansätzen:
# 1. Anzahl aktiver Verbindungen auf jedem Server.
# 2. Anzahl neuer Verbindungen zu jedem Server.
# 3. Eingabe der Advisor.
# 4. Eingabe vom Advisor auf Systemebene.
# Diese Proportionen müssen in der Summe 100 ergeben. Sie können
# die Managerproportionen beispielsweise wie folgt festlegen:
#    dscontrol manager proportions 48 48 4 0
# Damit fließen die aktiven und neuen Verbindungen mit jeweils 48 %
# in die Gewichtungsentscheidung ein. Die Advisor fließen
# zu 4 % ein und die Systemeingaben werden nicht berücksichtigt.
#
# ANMERKUNG. Standardmäßig sind die Managerproportionen auf 50 50 0 0 gesetzt.
#

# echo "Manager wird gestartet..."
# dscontrol manager start

# echo "FTP-Advisor wird an Port 21 gestartet ..."
# dscontrol advisor start ftp 21
# echo "HTTP-Advisor wird an Port 80 gestartet ..."
# dscontrol advisor start http 80
# echo "Telnet-Advisor wird an Port 23 gestartet ..."
# dscontrol advisor start telnet 23
# echo "SMTP-Advisor wird an Port 25 gestartet ..."
# dscontrol advisor start smtp 25
# echo "POP3-Advisor wird an Port 110 gestartet ..."
# dscontrol advisor start pop3 110
# echo "NNTP-Advisor wird an Port 119 gestartet ..."
# dscontrol advisor start nntp 119
# echo "SSL-Advisor wird an Port 443 gestartet ..."
# dscontrol advisor start ssl 443
#


# echo "Managerproportionen werden festgelegt..."
# dscontrol manager proportions 58 40 2 0

#
# Der letzte Konfigurationsschritt für die Dispatcher-Maschine
# ist das Festlegen eines Aliasnamens auf der Netzschnittstellenkarte (NIC).
#
# ANMERKUNG: Verwenden Sie diesen Befehl NICHT in einer Umgebung mit hoher
# Verfügbarkeit. Die NIC und die Loopback-Adresse werden von den
# go*-Scripts konfiguriert.
# dscontrol executor configure $CLUSTER

# Wenn die Clusteradresse sich auf einer von der NFA abweichenden
# NIC oder in einem abweichenden Teilnetz befindet, verwenden Sie für
# den Befehl zur Clusterkonfiguration das folgende Format:

# tr0 ist hier die NIC (tr1 die zweite Token-Ring-Karte, en0
# die erste Ethernet-Karte) und 0xfffff800 ist eine für
# Ihre Site gültige Teilnetzmaske.
#

#
# Die folgenden Befehle aktivieren die Standardwerte.
# Verwenden Sie diese Befehle als Ausgangspunkt für Änderungen der Standardwerte.
#  dscontrol manager loglevel    1
#  dscontrol manager logsize     1048576
#  dscontrol manager sensitivity 5
#  dscontrol manager interval    2
#  dscontrol manager refresh     2
#
#  dscontrol advisor interval ftp  21  5
#  dscontrol advisor loglevel ftp  21  1
#  dscontrol advisor logsize  ftp  21  1048576
#  dscontrol advisor timeout  ftp  21  unlimited
#  dscontrol advisor interval telnet 23 5
#  dscontrol advisor loglevel telnet 23 1
#  dscontrol advisor logsize  telnet 23 1048576
#  dscontrol advisor timeout  telnet 23 unlimited
#  dscontrol advisor interval smtp 25  5
#  dscontrol advisor loglevel smtp 25  1
#  dscontrol advisor logsize  smtp 25  1048576
#  dscontrol advisor timeout  smtp 25  unlimited
#  dscontrol advisor interval http 80  5
#  dscontrol advisor loglevel http 80  1
#  dscontrol advisor logsize  http 80  1048576
#  dscontrol advisor timeout  http 80  unlimited
#  dscontrol advisor interval pop3 110 5    
#  dscontrol advisor loglevel pop3 110 1
#  dscontrol advisor logsize  pop3 110 1048576
#  dscontrol advisor timeout  pop3 110 unlimited
#  dscontrol advisor interval nntp 119 5
#  dscontrol advisor loglevel nntp 119 1
#  dscontrol advisor logsize  nntp 119 1048576
#  dscontrol advisor timeout  nntp 119 unlimited
#  dscontrol advisor interval ssl  443 5
#  dscontrol advisor loglevel ssl  443 1
#  dscontrol advisor logsize  ssl  443 1048576
#  dscontrol advisor timeout  ssl  443 unlimited
#

Dispatcher-Konfigurationsdatei — Windows-Systeme

Die folgende Konfigurationsdatei ist die Load-Balancer-Beispielkonfigurationsdatei configuration.cmd.sample, die mit Windows verwendet wird.

@echo off
rem configuration.cmd.sample - Beispielkonfigurationsdatei für die
rem Komponente Dispatcher.
rem 

rem dsserver muss im Fenster "Dienste" gestartet werden.

rem 

rem 
rem Starten Sie dann den Executor.
rem 
rem call dscontrol executor start

rem 

rem Der nächste Konfigurationsschritt für den Dispatcher
rem ist das Festlegen der NFA und der Clusteradresse(n).
rem 

rem Die NFA wird für den Fernzugriff auf die Dispatcher-Maschine
rem zu Verwaltungs- oder Konfigurationszwecken verwendet. Diese
rem Adresse ist erforderlich, da der Dispatcher Pakete an die
rem Clusteradresse(n) weiterleitet.

rem 
rem Die CLUSTER-Adresse ist der Hostname (oder die IP-Adresse)
rem zu dem (bzw. zu der) ferne Clients eine Verbindung herstellen.
rem 

rem Hostnamen und IP-Adressen sind an jeder Stelle dieser
rem Datei beliebig gegeneinander austauschbar.
rem  NFA=[Non-Forwarding Address]
rem CLUSTER=[Clustername]
rem 

rem set NFA=Hostname.Domäne.Name
rem set CLUSTER=www.IhreFirma.com

rem echo "NFA wird geladen"
rem call dscontrol executor set nfa %NFA%

rem 
rem Mit den folgenden Befehlen werden die Standardwerte festgelegt.
rem Verwenden Sie diese Befehle zum Ändern der Standardwerte.

rem  call dscontrol executor set fintimeout 30
rem 
rem Der nächste Konfigurationsschritt für den Dispatcher ist
rem das Erstellen eines Clusters. Der Dispatcher leitet an die
rem Clusteradresse gesendete Anforderungen an die entsprechenden,
rem für diesen Cluster definierten Servermaschinen weiter. Mit
rem Dispatcher können Sie mehrere Clusteradressen konfigurieren
rem und bedienen.
rem Verwenden Sie für CLUSTER2, CLUSTER3 usw. eine ähnliche Konfiguration.
rem 

rem echo "Erste Clusteradresse wird geladen"
rem call dscontrol cluster add %CLUSTER%

rem 
rem Jetzt müssen die Ports definiert werden, die dieser Cluster
rem verwendet. Alle vom Dispatcher an einem definierten Port
rem empfangenen Anforderungen werden an den entsprechenden Port
rem einer der Servermaschinen weitergeleitet.
rem 

rem echo "Ports für CLUSTER %CLUSTER% werden erstellt"
rem call dscontrol port add %CLUSTER%:20+21+80

rem 
rem Der letzte Schritt ist das Hinzufügen der einzelnen Servermaschinen
rem zu den Ports dieses Clusters. Auch hier können Sie entweder den
rem Hostnamen oder die IP-Adresse der Servermaschinen verwenden.
rem 

rem set SERVER1=Servername1.Domäne.Name
rem set SERVER2=Servername2.Domäne.Name
rem set SERVER3=Servername3.Domäne.Name

rem echo "Servermaschinen werden hinzugefügt"
rem call dscontrol server add %CLUSTER%:20+21+80:
rem %SERVER1%+%SERVER2%+%SERVER3%

rem 
rem Jetzt werden die Lastausgleichskomponenten von Dispatcher
rem gestartet. Die Hauptkomponente ist der Manager.
rem Die sekundären Komponenten sind die Advisor. Sind
rem Manager und Advisor nicht aktiv sendet der
rem Dispatcher Anforderungen in einem RoundRobin-Format.
rem Sobald der Manager gestartet ist, werden Gewichtungsentscheidungen
rem auf der Grundlage der Anzahl neuer und aktiver Verbindungen
rem getroffen und eingehende Anforderungen an den am besten geeigneten
rem Server gesendet. Die Advisor geben dem Manager
rem Einblick in die Fähigkeit eines Servers, Anforderungen zu bedienen,
rem und können feststellen, ob ein Server aktiv ist. Erkennt ein
rem Advisor, dass ein Server inaktiv ist, wird dieser
rem entsprechend markiert (sofern die Managerproportionen so festgelegt
rem wurden, dass die Eingabe vom Advisor einbezogen wird), und es werden
rem keine weiteren Anforderungen an den Server weitergeleitet.
rem Der letzte Schritt beim Konfigurieren der Lastausgleichskomponenten
rem ist das Festlegen der Managerproportionen. Der Manager aktualisiert
rem die Wertigkeit der Server ausgehend von vier verschiedenen Ansätzen:

rem   1.  Anzahl aktiver Verbindungen auf jedem Server.
rem   2.  Anzahl neuer Verbindungen für jeden Server.
rem   3. Eingabe der Advisor.
rem   4. Eingabe vom Advisor auf Systemebene. rem 
rem  Diese Proportionen müssen in der Summe 100 ergeben. Sie können
rem  die Clusterproportionen beispielsweise wie folgt festlegen:
rem      dscontrol cluster set <Cluster> proportions 48 48 4 0
rem  Damit fließen die aktiven und neuen Verbindungen mit jeweils 48 %
rem  in die Gewichtungsentscheidung ein. Die Advisor fließen
rem  zu 4 % ein und die Systemeingaben werden nicht berücksichtigt.
rem 
rem ANMERKUNG. Standardmäßig sind die Managerproportionen auf
rem 50 50 0 0 gesetzt.

rem echo "Manager wird gestartet..."
rem call dscontrol manager start
rem echo "FTP-Advisor wird an Port 21 gestartet ..."
rem call dscontrol advisor start ftp 21
rem echo "HTTP-Advisor wird an Port 80 gestartet ..."
rem call dscontrol advisor start http 80
rem echo "Telnet-Advisor wird an Port 23 gestartet ..."
rem call dscontrol advisor start telnet 23
rem echo "SMTP-Advisor wird an Port 25 gestartet ..."
rem call dscontrol advisor start smtp 25
rem echo "POP3-Advisor wird an Port 110 gestartet ..."
rem call dscontrol advisor start pop3 110
rem echo "NNTP-Advisor wird an Port 119 gestartet ..."
rem call dscontrol advisor start nntp 119
rem echo "SSL-Advisor wird an Port 443 gestartet ..."
rem call dscontrol advisor start ssl 443 

rem 

rem echo "Clusterproportionen werden festgelegt..."
rem call dscontrol cluster set %CLUSTER% proportions 58 40 2 0

rem 
rem Der letzte Konfigurationsschritt für die Dispatcher-Maschine
rem ist das Festlegen eines Aliasnamens auf der Netzschnittstellenkarte (NIC).
rem 
rem ANMERKUNG: Verwenden Sie diesen Befehl NICHT in einer Umgebung mit hoher
rem Verfügbarkeit. Die NIC und die Loopback-Adresse werden von den
rem go*-Scripts konfiguriert.
rem 
rem dscontrol executor configure %CLUSTER%

rem Wenn die Clusteradresse sich auf einer von der NFA abweichenden
rem NIC oder in einem abweichenden Teilnetz befindet, verwenden Sie für
rem den Befehl cluster configure das folgende Format:
rem  dscontrol executor configure %CLUSTER% tr0 0xfffff800
rem tr0 ist hier die NIC (tr1 die zweite Token-Ring-Karte, en0
rem die erste Ethernet-Karte) und 0xfffff800 ist eine für
rem Ihre Site gültige Teilnetzmaske.
rem 

rem 
rem Mit den folgenden Befehlen werden die Standardwerte festgelegt.
rem Verwenden Sie diese Befehle als Ausgangspunkt zum Ändern der Standardwerte.
rem call dscontrol manager loglevel    1
rem call dscontrol manager logsize     1048576
rem call dscontrol manager sensitivity 5
rem call dscontrol manager interval    2
rem call dscontrol manager refresh     2
rem 
rem call dscontrol advisor interval ftp  21  5
rem call dscontrol advisor loglevel ftp  21  1
rem call dscontrol advisor logsize  ftp  21  1048576
rem call dscontrol advisor timeout  ftp  21  unlimited
rem call dscontrol advisor interval telnet 23 5
rem call dscontrol advisor loglevel telnet 23 1
rem call dscontrol advisor logsize  telnet 23 1048576
rem call dscontrol advisor timeout  telnet 23 unlimited
rem call dscontrol advisor interval smtp 25  5
rem call dscontrol advisor loglevel smtp 25  1
rem call dscontrol advisor logsize  smtp 25  1048576
rem call dscontrol advisor timeout  smtp 25  unlimited
rem call dscontrol advisor interval http 80  5
rem call dscontrol advisor loglevel http 80  1
rem call dscontrol advisor logsize  http 80  1048576
rem call dscontrol advisor timeout  http 80  unlimited
rem call dscontrol advisor interval pop3 110 5
rem call dscontrol advisor loglevel pop3 110 1
rem call dscontrol advisor logsize  pop3 110 1048576
rem call dscontrol advisor timeout  pop3 110 unlimited
rem call dscontrol advisor interval nntp 119 5
rem call dscontrol advisor loglevel nntp 119 1
rem call dscontrol advisor logsize  nntp 119 1048576
rem call dscontrol advisor timeout  nntp 119 unlimited
rem call dscontrol advisor interval ssl  443 5
rem call dscontrol advisor loglevel ssl  443 1
rem call dscontrol advisor logsize  ssl  443 1048576
rem call dscontrol advisor timeout  ssl  443 unlimited
rem 

Beispieladvisor

Nachfolgend ist die Advisorbeispieldatei ADV_sample wiedergegeben.

/**
 * ADV_sample: HTTP-Advisor von Load Balancer
 * 
 * 
 * Diese Klasse definiert einen angepassten Beispiel-Advisor für Load Balancer.
 * Dieser angepasste Advisor erweitert wie alle anderen Advisor den
 * Advisorbasiscode ADV_Base. Es ist der Advisorbasiscode, der die meisten
 * Advisor ausführt. Dazu gehört das Zurückmelden der Arbeitslasten 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 im
 * Advisorbasiscode 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 gesetzten
 * Wert für den Wertigkeitsalgorithmus bereit. Ist der eigentliche
 * Advisor noch nicht 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 in den folgenden Load-Balancer-Verzeichnissen befinden:
 *   
 *    lb/servers/lib/CustomAdvisors/ (Windows: lb\servers\lib\CustomAdvisors)
 *
 * - 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 für Load Balancer generell gültig,
 * mit der erforderlichen Java-Version 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 = Nicht verwendet; muss als "" ü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 - Null gibt unabhängig vom erfolgreichen/gescheiterten Empfang
 *                der Daten an, dass die Daten gesendet 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 sehr einfache 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
 * 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 Advisor-spezifische 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 entsprechend des
   *   Flags 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 zeigt an, 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 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 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 vom Basis-Advisor 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