Appendice C. File di configurazione di esempio

Questo appendice contiene i file di configurazione di esempio per il componente Dispatcher di Load Balancer.

File di configurazione di Load Balancer di esempio

I file di esempio si trovano nella seguente directory:

File di configurazione di Dispatcher -- sistemi AIX, Linux e Solaris

#!/bin/bash
#
# configuration.sample - File di configurazione di esempio per il
Componente Dispatcher
#
#
# Accertarsi che l'utente root sia l'utente che esegue lo script.
#
# iam=`whoami`
 
# if [ "$iam" != "root" ]if [ "$iam" != "root" ]
#  then 
#  echo "You must login as root to run this script"
#   exit 2
# fi 

#
# In primo luogo, avviare il server
#
# dsserver start
# sleep 5

#
# Quindi, avviare l'executor
#
# dscontrol executor start

#
#  Il Dispatcher può essere eliminato in qualsiasi momento utilizzando 
# i comandi "dscontrol executor stop" e "dsserver stop" per 
# arrestare rispettivamente l'executor e il server prima di rimuovere 
# il software di Dispatcher.
#
# Il passo successivo nella configurazione di Dispatcher è impostare 
# l'indirizzo NFA (indirizzo di non inoltro) e gli indirizzi cluster.
#
# L'NFA viene utilizzato per accedere in remoto alla macchina Dispatcher 
# a scopi di amministrazione o configurazione.  Questo 
# indirizzo è necessario in quanto il Dispatcher inoltrerà i pacchetti 
# agli indirizzi cluster.
# 
# L'indirizzo CLUSTER è il nome host (o l'indirizzo IP) a cui 
# si collegano i client remoti.
#
# In qualunque punto di questo file, i nomi host e gli 
# indirizzi IP sono intercambiabili.
#

# NFA=hostname.domain.name
# CLUSTER=www.yourcompany.com

# echo "Loading the non-forwarding address"
# dscontrol executor set nfa $NFA

#
#  Il passo successivo nella configurazione di Dispatcher è creare 
# un cluster.  Il Dispatcher instrada le richieste inviate 
# all'indirizzo cluster alle macchine server corrispondenti
# definite per quel cluster. È possibile configurare e utilizzare 
# più indirizzi cluster tramite Dispatcher. 

# Utilizzare una configurazione simile per CLUSTER2, CLUSTER3 ecc.
#

# echo "Loading first CLUSTER address "
# dscontrol cluster add $CLUSTER

#
# Ora occorre definire le porte che saranno utilizzate da questo cluster. 
# Qualsiasi richiesta ricevuta da Dispatcher su una porta definita verrà 
# inoltrata alla porta corrispondente di una delle macchine 
# server.
#

# echo "Creating ports for CLUSTER: $CLUSTER"

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

#
# L'ultimo passo consiste nell'aggiungere ciascuna macchina server 
# alle porte di questo cluster.
# Anche in questo caso, è possibile utilizzare il nome host o 
# l'indirizzo IP delle macchine server.
#

# SERVER1=server1name.domain.name
# SERVER2=server2name.domain.name 
# SERVER3=server3name.domain.name

# echo "Adding server machines"
# dscontrol server add $CLUSTER:20+21+80:
# $SERVER1+$SERVER2+$SERVER3

#
#  Si avviano ora i componenti di bilanciamento del carico di 
# Dispatcher.  Il componente principale viene definito 
# gestore e i componenti secondari advisor. 
# Se il gestore e gli advisor non sono in esecuzione, 
# Dispatcher invia le richieste in formato round-robin. Dopo aver 
# avviato il gestore, vengono prese le decisioni sul calcolo dei pesi, 
# in base al numero di connessioni nuove e di connessioni attive, e le richieste 
# in entrata sono inviate al server considerato più adatto. Gli advisor 
# forniscono al gestore ulteriori informazioni sulla capacità di un 
# server di ricevere le richieste e rilevano se un server è attivo.
# Se un advisor rileva un server inattivo, lo contrassegna 
# come tale (a condizione che le proporzioni del gestore siano state impostate 
# in modo da includere l'input dell'advisor) e nessuna ulteriore richiesta
# sarà instradata verso quel server.

#  L'ultimo passo nella configurazione dei componenti di bilanciamento 
# del carico consiste nell'impostare le proporzioni del gestore. Il gestore 
# aggiorna il peso di ciascun server in base a quattro politiche:
#   1. Il  numero delle connessioni attive su ciascun server.
#   2. Il numero delle nuove connessioni a ciascun server.
#   3. L'input proveniente dagli advisor.
#   4. L'input proveniente dagli advisor del sistema.
# La somma di tali proporzioni deve essere 100. Ad esempio, 
# se si impostano le proporzioni del gestore su
#    dscontrol manager proportions 48 48 0 0
# le connessioni attive e nuove rappresenteranno il 48% nella 
# decisione sul calcolo dei pesi, gli advisor contribuiranno nella 
# misura del 4% e l'input del sistema non verrà preso in considerazione.
#
# NOTA: per impostazione predefinita, le proporzioni del gestore sono impostate a 50 50 0 0
#

# echo "Starting the manager..."
# dscontrol manager start

# echo "Starting the FTP advisor on port 21 ..."
# dscontrol advisor start ftp 21
# echo "Starting the HTTP advisor on port 80 ..."
# dscontrol advisor start http 80
# echo "Starting the Telnet advisor on port 23 ..."
# dscontrol advisor start telnet 23
# echo "Starting the SMTP advisor on port 25 ..."
# dscontrol advisor start smtp 25
# echo "Starting the POP3 advisor on port 110 ..."
# dscontrol advisor start pop3 110
# echo "Starting the NNTP advisor on port 119 ..."
# dscontrol advisor start nntp 119
# echo "Starting the SSL advisor on port 443 ..."
# dscontrol advisor start ssl 443
#

# echo "Setting the manager proportions..."
# dscontrol manager proportions 58 40 2 0

#
# Il passo finale nella configurazione della macchina Dispatcher è creare 
# l'alias della scheda di interfaccia di rete(NIC).
#
# NOTA: NON utilizzare questo comando in un ambiente con la funzione 
# di disponibilità elevata abilitata.  Gli script go* configureranno 
# la NIC e il loopback come necessario.
# dscontrol executor configure $CLUSTER

#  Se l'indirizzo cluster si trova su una NIC o sottorete diversa 
da quella di NFA utilizzare il seguente formato per il comando 
di configurazione del cluster.
#  dscontrol executor configure $CLUSTER en0 0xfffff800
# dove en0 è la prima scheda ethernet 
# e 0xfffff800 è una valida maschera di sottorete per il proprio sito.
#

#
# I seguenti comandi sono impostati sui valori predefiniti.  
# Utilizzare questi comandi come guida per modificare i valori predefiniti.
#  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
#

File di configurazione di Dispatcher -- sistemi Windows

Di seguito viene riportato un file di configurazione di esempio di Load Balancer denominato configuration.cmd.sample da utilizzare in Windows.

@echo off
rem configuration.cmd.sample - File di configurazione di esempio per il
rem componente Dispatcher.
rem

rem dsserver deve essere avviato dal pannello Servizi

rem

rem
rem Quindi, avviare l'executor
rem
rem call dscontrol executor start

rem

rem Il passo successivo nella configurazione di Dispatcher è impostare
rem l'indirizzo NFA (indirizzo di non inoltro) e impostare gli 
rem indirizzi cluster.
rem

rem L'NFA viene utilizzato per accedere in remoto alla macchina Dispatcher 
rem a scopi di amministrazione o configurazione.  Questo 
rem indirizzo è necessario in quanto il Dispatcher inoltrerà 
rem i pacchetti agli indirizzi cluster.

rem
rem L'indirizzo CLUSTER è il nome host (o l'indirizzo IP) a cui 
rem si collegano i client remoti.
rem

rem In qualunque punto di questo file, i nomi host e gli 
rem indirizzi IP sono intercambiabili. 
rem  NFA=[Non-forwarding address]
rem CLUSTER=[your clustername]
rem

rem set NFA=hostname.domain.name
rem set CLUSTER=www.yourcompany.com

rem echo "Loading the non-forwarding address"
rem call dscontrol executor set nfa %NFA%

rem
rem I seguenti comandi sono impostati sui valori predefiniti. 
rem Utilizzare questi comandi per modificare i valori predefiniti.

rem  call dscontrol executor set fintimeout 30
rem
rem Il passo successivo nella configurazione di Dispatcher è creare 
rem un cluster.  Il Dispatcher instrada le richieste inviate 
rem all'indirizzo cluster alle macchine server corrispondenti 
rem definite per quel cluster. È possibile configurare e utilizzare
rem più indirizzi cluster tramite Dispatcher.
rem Utilizzare una configurazione simile per CLUSTER2, CLUSTER3 ecc.
rem

rem echo "Loading first CLUSTER address "
rem call dscontrol cluster add %CLUSTER%

rem
rem Ora occorre definire le porte che saranno utilizzate da questo cluster. 
rem Qualsiasi richiesta ricevuta da Dispatcher su una porta definita verrà 
rem inoltrata alla porta corrispondente
rem di una delle macchine server.
rem

rem echo "Creating ports for CLUSTER: %CLUSTER%"
rem call dscontrol port add %CLUSTER%:20+21+80

rem
rem L'ultimo passo consiste nell'aggiungere ciascuna macchina server 
rem alle porte di questo cluster. Anche in questo caso, è possibile utilizzare 
rem il nome host o l'indirizzo IP delle macchine server.
rem

rem set SERVER1=server1name.domain.name
rem set SERVER2=server2name.domain.name
rem set SERVER3=server3name.domain.name

rem echo "Adding server machines"
rem call dscontrol server add %CLUSTER%:20+21+80:
rem %SERVER1%+%SERVER2%+%SERVER3%

rem
rem  Si avviano ora i componenti di bilanciamento del carico di 
rem Dispatcher.  Il componente principale viene definito 
rem gestore e i componenti secondari advisor. 
rem Se il gestore e gli advisor non sono in esecuzione,
rem Dispatcher invia le richieste in formato round-robin. Dopo aver 
rem avviato il gestore, vengono prese le decisioni sul calcolo dei pesi, 
rem in base al numero di connessioni nuove e di connessioni attive, e le richieste 
rem in entrata sono inviate al server considerato più adatto. Gli advisor
rem forniscono al gestore ulteriori informazioni 
rem ulteriori informazioni sulla capacità di un 
rem server di ricevere le richieste e rilevano se un server è attivo. 
rem Se un advisor rileva un server inattivo, lo contrassegna come tale
rem (a condizione che le proporzioni del gestore siano state impostate 
rem in modo da includere l'input dell'advisor) e nessuna ulteriore richiesta sarà
rem instradata verso quel server.
rem  L'ultimo passo nella configurazione dei componenti di bilanciamento 
rem del carico consiste nell'impostare le proporzioni del gestore. Il 
rem gestore aggiorna il peso di ciascun server in base 
rem a quattro politiche:

rem   1. Il  numero delle connessioni attive su ciascun server.
rem   2. Il numero delle nuove connessioni a ciascun server.
rem   3. L'input proveniente dagli advisor.
rem   4. L'input proveniente dagli advisor del sistema.
rem
rem La somma di tali proporzioni deve essere 100. Ad esempio, 
rem  impostando le proporzioni del cluster mediante
rem      dscontrol cluster set <cluster> proportions 48 48 4 0
rem le connessioni attive e nuove rappresenteranno il 48% nella 
rem decisione sul calcolo dei pesi, l'advisor contribuirà nella 
rem misura del 4% e l'input del sistema non verrà preso in considerazione.
rem
rem NOTA: per impostazione predefinita, le proporzioni del gestore sono impostate a 
rem 50 50 0 0

rem echo "Starting the manager..."
rem call dscontrol manager start

rem echo "Starting the FTP advisor on port 21 ..."
rem call dscontrol advisor start ftp 21
rem echo "Starting the HTTP advisor on port 80 ..."
rem call dscontrol advisor start http 80
rem echo "Starting the Telnet advisor on port 23 ..."
rem call dscontrol advisor start telnet 23
rem echo "Starting the SMTP advisor on port 25 ..."
rem call dscontrol advisor start smtp 25
rem echo "Starting the POP3 advisor on port 110 ..."
rem call dscontrol advisor start pop3 110
rem echo "Starting the NNTP advisor on port 119 ..."
rem call dscontrol advisor start nntp 119
rem echo "Starting the SSL advisor on port 443 ..."
rem call dscontrol advisor start ssl 443
rem

rem echo "Setting the cluster proportions..."
rem call dscontrol cluster set %CLUSTER% proportions 58 40 2 0

rem
rem Il passo finale nella configurazione della macchina Dispatcher è creare
rem l'alias della scheda di interfaccia di rete (NIC).
rem
rem NOTA: NON utilizzare questo comando in un ambiente con la funzione 
rem di disponibilità elevata abilitata.  Gli script go* configureranno 
rem la NIC e il loopback come necessario.
rem
rem dscontrol executor configure %CLUSTER%

rem  Se l'indirizzo cluster si trova su una NIC o sottorete diversa 
rem  da quella di NFA utilizzare il seguente formato per il comando 
rem  di configurazione del cluster.
rem  dscontrol executor configure %CLUSTER% en0 0xfffff800
rem  dove en0 è la prima scheda ethernet e 0xfffff800 è 
rem  una maschera di sottorete valida per questo sito.
rem

rem
rem I seguenti comandi sono impostati sui valori predefiniti.
rem Utilizzare questi comandi come guida per modificare i valori predefiniti.
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

Advisor di esempio

Di seguito è riportato un file advisor di esempio denominato ADV_sample.

/**
 * ADV_sample:  L'advisor HTTP di Load Balancer
 * 
 * 
 * Questa classe definisce un advisor personalizzato di esempio per Load Balancer.
 * Analogamente a
 tutti gli advisor, questo advisor personalizzato estende la funzione
 * dell'advisor di base,
 denominato ADV_Base. L'advisor di base esegue effettivamente
 * la maggior parte delle
 funzioni dell'advisor, come ad esempio l'invio dei carichi
 * a Load Balancer da utilizzare nell'algoritmo di valutazione di Load Balancer. Inoltre,
 * tale advisor effettua le operazioni di connessione e chiusura del socket e fornisce
 * i metodi di invio e di ricezione 
 all'advisor. L'advisor stesso viene utilizzato
 * esclusivamente per l'invio e la ricezione dei dati a e dalla porta sul server
 * esaminato. I metodi TCP forniti con l'advisor di base sono programmati per calcolare 
 * il carico. Se necessario, un indicatore all'interno del costruttore dell'advisor 
 * di base sostituisce il carico esistente con il nuovo carico restituito dall'advisor.
 *
 * Nota: in base al valore impostato nel costruttore, l'advisor di base fornisce
 * il carico all'algoritmo di valutazione a intervalli specifici.  Se
 * l'advisor effettivo non è stato completato in modo che restituisca un carico valido,
 * l'advisor di base utilizza il carico precedente.
 *  
 * DENOMINAZIONE 
 * 
 * La convenzione di denominazione è la seguente:
 *
 *  - Il file deve trovarsi nella seguente directory Load Balancer:
 *   
 *    lb/servers/lib/CustomAdvisors/ (lb\servers\lib\CustomAdvisors su Windows)
 *
 * - Il nome Advisor deve essere preceduto da "ADV_".  Tuttavia, è possibile 
 *    avviare l'advisor solo con il nome; ad esempio, l'advisor "ADV_sample"
 *    può essere avviato con "sample".
 *
 * - Il nome dell'advisor deve avere caratteri minuscoli.
 *
 *  Quindi, tenendo presente quanto riportato sopra, questo esempio viene definito:
 * 
 *             <base directory>/lib/CustomAdvisors/ADV_sample.class
 *
 *
 * Gli advisors, come tutti i componenti restanti di Load Balancer, devono essere 
 * compilati con la versione prereq di Java. Per garantire l'accesso alle classi Load Balancer,
 * verificare che il file ibmlb.jar (situato nella sottodirectory lib della directory
 * di base) sia incluso nel CLASSPATH del sistema.
 *
 * Metodi forniti da ADV_Base:
 * 
 * - ADV_Base (Costruttore):
 *
 *   - Parametri
 *     - String sName = Nome dell'advisor
 *     - String sVersion = Versione dell'advisor
 *     - int iDefaultPort = Numero porta predefinita su cui effettuare l'esame
 *     - int iInterval = Intervallo durante il quale eseguire l'esame dei server
 *     - String sDefaultName = Non utilizzato.  Deve essere inviato come "".
 *     - boolean replace = True - sostituisce il valore del carico calcolato
 *                                dall'advisor di base
 *                         False - aggiunge il valore del carico calcolato
 *                                 dall'advisor di base
 *   - Valori di ritorno
 *     - I costruttori non hanno valori di ritorno.
 *
 * Poiché l'advisor di base è basato sul thread, sono disponibili
 * altri metodi a cui è possibile fare riferimento utilizzando
 * il parametro CALLER inviato in getLoad().
 *
 * Questi metodi sono:
 * 
 * - send - Invia un pacchetto di informazioni sulla connessione socket stabilita
 *           al server sulla porta specificata.
 *   - Parametri
 *     - String sDataString - I dati da inviare sotto forma di una stringa
 *   - Valori di ritorno
 *     - int RC - Invio dei dati riuscito o meno: zero indica che
 *                 i dati sono stati inviati; un valore intero negativo indica un errore.
 * 
 * - receive - Riceve le informazioni dalla connessione socket connection.
 *   - Parametri
 *     - StringBuffer sbDataBuffer - I dati ricevuti durante la chiamata di ricezione
 *   - Valori di ritorno
 *     - int RC - Ricezione dei dati riuscita o meno; zero
 *                indica che i dati sono stati inviati; un valore intero negativo indica
 *                un errore.
 *
 * Se la funzione fornita dall'advisor di base non è sufficiente, 
 * è possibile creare la funzione adeguata nell'advisor e
 * i metodi forniti dall'advisor di base verranno ignorati.  
 *
 * Una domanda importante sul carico restituito è se applicare 
 * tale carico a quello generato nell'advisor di base 
 * oppure se sostituirlo; sono presenti istanze valide di entrambe le situazioni.
 * 
 * Questo esempio corrisponde essenzialmente all'advisor HTTP di Load Balancer. Il funzionamento
 * è molto semplice: viene emessa una richiesta di invio--una richiesta head http. Quando viene
 * ricevuta la risposta, il metodo getLoad termina, indicando all'advisor
 * di base di arrestare la sincronizzazione della richiesta.  Il metodo è quindi completo.  Le
 * informazioni restituite non vengono analizzate; il carico si basa sul tempo
 * necessario per eseguire le operazioni di invio e ricezione.
 */

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;

  // Nota: la maggior parte dei protocolli del server richiede un ritorno a capo ("\r")
  //       e un avanzamento riga ("\n") alla fine dei messaggi. In questo caso, includerli
  //       nella stringa.
  static final String  ADV_SEND_REQUEST      = 
    "HEAD / HTTP/1.0\r\nAccept: */*\r\nUser-Agent: " +
    "IBM_Load_Balancer_HTTP_Advisor\r\n\r\n";

  /**
   * Costruttore.
   *
   * Parametri:  Nessuno ma il costruttore per ADV_Base ha diversi parametri 
   *         che devono essere inviati.
   *
   */
  public ADV_sample()
  {
    super( ADV_NAME,
       "2.0.0.0-03.27.98",
           ADV_DEF_ADV_ON_PORT,
           ADV_DEF_INTERVAL,
           "",     // non utilizzato
           false);
    super.setAdvisor( this );
  }


  /**
   * ADV_AdvisorInitialize
   *
   * Qualsiasi inizializzazione specifica dell'advisor che deve essere effettuata
   * in seguito all'avvio dell'advisor di base. Questo metodo viene richiamato solo 
   *  una volta e, generalmente, non viene utilizzato.
   */
  public void ADV_AdvisorInitialize()
  {
    return;
  }


  /**
   * getLoad()
   *
   * Questo metodo viene chiamato dall'advisor di base per completare il funzionamento
   * dell'advisor, in base ai dettagli specifici del protocollo.  In questo advisor
   * di esempio, è necessaria solo una singola operazione di invio e di ricezione; in
   * caso di logiche più complesse, è possibile emettere più operazioni di invio e
   * ricezione. Adesempio, una risposta potrebbe essere ricevuta e analizzata. In base alle 
   * informazioni apprese, potrebbe essere emessa un'altra operazione di invio e di ricezione.
   *
   * Parametri:
   * 
   * - iConnectTime - Il carico corrente poiché fa riferimento al tempo impiegato
   *                  per completare la connessione al server attraverso
   *                  la porta specificata.
   *
   * - caller - Un riferimento alla classe dell'advisor di base in cui i metodi forniti da Load 
   *            Balancer devono eseguire richieste TCP semplici,
   *            principalmente l'invio e la ricezione.
   *
   * Risultati:
   *
   * - Carico - Un valore, espresso in millisecondi, che può essere aggiunto
   *   o sostituito al carico esistente, come specificato 
   *   dall'indicatore "replace" del costruttore.
   *
   *   Più è grande il carico e maggiore sarà il tempo necessario al server per rispondere; 
   *   quindi, il peso all'interno di Load Balancer verrà ridotto.
   *
   *   Se il valore è negativo, potrebbe essersi verificato un errore.  Un errore proveniente 
   *   da un advisor indica che il server che sta tentando di raggiungere non
   *   è accessibile ed è stato individuato come disattivo. Load Balancer
   *   non tenterà di eseguire il bilanciamento del carico su un server disattivo. Load Balancer 
   *   riprenderà tale operazione quando riceverà un valore positivo da tale server.
   *
   */
  public int getLoad(int iConnectTime, ADV_Thread caller) {
    int iRc;
    int iLoad = ADV_HOST_INACCESSIBLE;    // -1

    // Per inviare la richiesta tcp
    iRc = caller.send(ADV_SEND_REQUEST);
    if (iRc >= 0)
    {
      // Per eseguire una ricezione
      StringBuffer sbReceiveData = new StringBuffer("");
      iRc = caller.receive(sbReceiveData);

      /**
      *  In modalità advisor normale (l'indicatore "replace" è false), il carico
      *  restituito è 0 o 1 a seconda se il server è attivo o meno. 
      *  Se la ricezione è avvenuta con esito positivo, viene restituito un carico con valore
      *  zero che indica che è necessario utilizzare il carico creato nell'advisor di base.
      * 
      *  Altrimenti (l'indicatore "replace" è true), viene restituito il valore di carico
      *  desiderato.
      */

      if (iRc >= 0)
      {
        iLoad = 0;
      }
    }
    return iLoad;
  }

} // Fine - ADV_sample