Questo è un file dell'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. Come tutti * gli advisor, questo advisor personalizzato estende la funzione dell'advisor di base, * detto ADV_Base. Questo è l'advisor che esegue la maggior parte * delle funzioni dell'advisor, come ad esempio la notifica dei carichi al Load Balancer * da utilizzare nell'algoritmo di valutazione. Inoltre, l'advisor di base effettua le operazioni * di connessione e chiusura del socket e * fornisce i metodi di invio e di ricezione che saranno utilizzati dall'advisor. L'advisor * in sé viene utilizzato unicamente per l'invio e la * ricezione dei dati sulla porta specifica del server esaminato. * I metodi TCP interni all'advisor di base sono programmati per * calcolare il carico. * Se si desidera, 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 specificati. Se l'advisor effettivo non ha * completato l'elaborazione e non può restituire un carico valido, l'advisor di base utilizza il * carico inviato precedentemente. * * DENOMINAZIONE * * La convenzione di denominazione è: * * - Il file deve trovarsi nella seguente directory di Load Balancer: * * ulb/servers/lib/CustomAdvisors/ (ulb\servers\lib\CustomAdvisors su Windows) * * - Il nome dell'advisor deve essere preceduto da "ADV_". L'advisor può essere * avviato anche solo con il nome; ad esempio l'advisor "ADV_sample" * può essere avviato con "sample". * * - Il nome dell'advisor deve essere in minuscolo. * * Seguendo queste regole, l'esempio sarà: * * <directory base="">/lib/CustomAdvisors/ADV_sample.class * * * Gli advisor, come il resto del Load Balancer, devono essere compilati con * la versione prerequisita di Java. Per garantire l'accesso alle classi di Load Balancer, * verificare che il file ibmlb.jar (ubicato nella sottodirectory lib della * directory base) sia incluso nella variabile CLASSPATH del sistema. * * Metodi forniti da ADV_Base: * * - ADV_Base (Constructor): * * - Parametri * - String sName = Il nome dell'advisor * - String sVersion = La versione dell'advisor * - int iDefaultPort = Il numero di porta predefinito su cui eseguire l'analisi * - int iInterval = Intervallo in cui eseguire l'analisi sui server * - String sDefaultName = Non utilizzato. Deve essere inoltrato come "". * - boolean replace = True - sostituisce il valore di carico calcolato * con l'advisor di base * False - viene aggiunto al valore di carico calcolato * con l'advisor di base * - Ritorno * - I constructor non hanno valori di ritorno. * Poiché l'advisor di base è basato sul thread, sono disponibili * diversi altri metodi da utilizzare. * Tali metodi possono essere utilizzati mediante * 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 stringa * - Ritorno * - int RC - Indica se i dati sono stati correttamente inviati o meno: zero indica * che i dati sono stati inviati, un numero negativo indica un errore. * * - receive - Riceve informazioni dalla connessione socket. * - Parametri * - StringBuffer sbDataBuffer - I dati vengono ricevuti durante la chiamata a receive * - Ritorno * - int RC - Indica se i dati sono stati correttamente inviati o meno: zero indica * che i dati sono stati inviati, un numero negativo indica un errore. * * Se la funzione fornita dall'advisor di base non è sufficiente, * è possibile creare la funzione appropriata all'interno dell'advisor e * i metodi forniti dall'advisor verranno quindi ignorati. * * Un punto importante relativo al carico restituito è se applicarlo al carico * generato all'interno dell'advisor di base o se sostituirlo; * esistono istanze valide di entrambe le situazioni. * * Questo esempio corrisponde essenzialmente all'advisor HTTP di Load Balancer. * Esso è molto semplice: viene emessa una richiesta di invio, una richiesta head http. * Una volta ricevuta la risposta, il metodo getLoad termina, indicando all'advisor * di base di arrestare la tempificazione della richiesta. * Il metodo è quindi completo. Le informazioni restituite non vengono analizzate; * il carico si basa sul tempo richiesto 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 server richiede un ritorno a capo ("\r") e un // avanzamento riga ("\n") alla fine dei messaggi. In questo caso, includerli // nella propria stringa qui. 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. * * Parametri: None; ma il constructor per ADV_Base ha diversi parametri * che devono essere inoltrati. * */ 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 * * Qualsiasi inizializzazione specifica che deve essere eseguita * una volta avviato l'advisor di base. Questo metodo viene richiamato solo una volta * e di solito non è utilizzato. */ public void ADV_AdvisorInitialize() { return; } /** * getLoad() * * Questo metodo viene chiamato dall'advisor di base per completare l'operazione dell'advisor * in base ai dettagli specifici del protocollo. In questo advisor * di esempio, è necessario soltanto un invio e una ricezione; se è necessaria una * logica più complessa, è possibile emettere più invii e ricezioni. Ad * esempio, una risposta può essere ricevuta ed analizzata. In base alle informazioni, * è possibile emettere un altro invio e ricezione. * * Parametri: * * - iConnectTime - Il carico corrente in quanto fa riferimento al tempo necessario * per completare la connessione al server mediante * la porta specificata. * * - caller - Un riferimento alla classe dell'advisor di base in cui i metodi forniti * da Load Balancer devono eseguire semplice richieste TCP, principalmente * di invio e ricezione. * * Risultati: * * - Il carico - Un valore, espresso in millisecondi, che può essere aggiunto * al carico esistente oppure che può sostituirlo, come * determinato dall'indicatore "replace" del constructor. * * Maggiore è il carico, più tempo impiegherà il server a rispondere, * pertanto, minore sarà il peso all'interno di Load Balancer. * * Se il valore è negativo, si assume un errore. Un errore da un * advisor indica che il server che l'advisor sta provando a raggiungere * non è accessibile ed è stato identificato come inattivo. Load Balancer non * proverà a eseguire il bilanciamento carico su un server inattivo. Load Balancer * ripristinerà il bilanciamento del carico sul server quando verrà ricevuto un valore * positivo. * */ public int getLoad(int iConnectTime, ADV_Thread caller) { int iRc; int iLoad = ADV_HOST_INACCESSIBLE; // -1 // Invia la richiesta TCP iRc = caller.send(ADV_SEND_REQUEST); if (iRc >= 0) { // Esegue una ricezione StringBuffer sbReceiveData = new StringBuffer(""); iRc = caller.receive(sbReceiveData); /** * In modalità normale dell'advisor (indicatore "replace" impostato su false), il carico * restituito è 0 o 1, a indicare che il server è attivo o inattivo. * Se la ricezione avviene correttamente, viene restituito un carico pari a zero * a indicare che deve essere utilizzato il carico integrato nell'advisor di base. * * In caso contrario (indicatore "replace" impostato su true), viene restituito il * valore del carico desiderato. */ if (iRc >= 0) { iLoad = 0; } } return iLoad; } } // End - ADV_sample