Il seguente esempio dimostra come implementare un advisor a flusso laterale. Questo esempio illustra l'eliminazione del socket standard aperto dal codice di base dell'advisor. Questo advisor apre invece un socket Java di flusso laterale per interrogare un server. Questa procedura può essere utile per i server che utilizzano una porta diversa da quella utilizzata dal traffico normale del client per ascoltare una query dell'advisor.
In questo esempio, un server utilizza la porta 11999 e se interrogato restituisce un valore di carico con un intero esadecimale uguale a "4". Questo esempio viene eseguito in modalità di sostituzione, ovvero l'ultimo parametro del costruttore dell'advisor è impostato su true e il codice di base dell'advisor utilizza il valore di carico restituito invece del valore del tempo trascorso.
Notare la chiamata a supressBaseOpeningSocket() nella routine di inizializzazione. L'eliminazione del socket di base quando non viene inviato alcun dato è un'operazione necessaria. Ad esempio, potrebbe essere necessario aprire il socket per assicurarsi che l'advisor possa contattare il server. Esaminare attentamente le necessità della propria applicazione prima di prendere una decisione del genere.
package CustomAdvisors; import java.io.*; import java.net.*; import java.util.*; import java.util.Date; import com.ibm.internet.lb.advisors.*; import com.ibm.internet.lb.common.*; import com.ibm.internet.lb.server.SRV_ConfigServer; public class ADV_sidea extends ADV_Base implements ADV_MethodInterface { static final String ADV_NAME = "sidea"; static final int ADV_DEF_ADV_ON_PORT = 12345; static final int ADV_DEF_INTERVAL = 7; // creare un array di byte con il messaggio di richiesta del carico static final byte[] abHealth = {(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x04}; public ADV_sidea() { super(ADV_NAME, "3.0.0.0-03.31.00", ADV_DEF_ADV_ON_PORT, ADV_DEF_INTERVAL, "", true); // il parametro della modalità di sostituzione è true super.setAdvisor( this ); } //-------- // ADV_AdvisorInitialize public void ADV_AdvisorInitialize() { suppressBaseOpeningSocket(); // indicare al codice di base di non aprire // il socket standard return; } //-------- // getLoad public int getLoad(int iConnectTime, ADV_Thread caller) { int iRc; int iLoad = ADV_HOST_INACCESSIBLE; // -1 int iControlPort = 11999; // porta su cui comunicare // con il server String sServer = caller.getCurrentServerId(); // indirizzo del server da interrogare try { socket soServer = new Socket(sServer, iControlPort); // apertura del socket sul // server DataInputStream disServer = new DataInputStream( soServer.getInputStream()); DataOutputStream dosServer = new DataOutputStream( soServer.getOutputStream()); int iRecvTimeout = 10000; // impostare il timeout (in millisecondi) // per la ricezione dei dati soServer.setSoTimeout(iRecvTimeout); dosServer.writeInt(4); // inviare un messaggio al server dosServer.flush(); iLoad = disServer.readByte(); // ricevere la risposta dal server } catch (exception e) { system.out.println("Caught exception " + e); } return iLoad; // restituire il carico riportato dal server } }