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 si dimostra utile per i server che utilizzano una porta diversa rispetto al traffico normale del client per ascoltare una query di un 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
}
}