L'exemple ci-après illustre l'implémentation d'un conseiller de flux latéral. Il illustre la suppression du socket standard ouvert par la base du conseiller. A la place, ce conseiller ouvre un socket Java de flux latéral pour interroger un serveur. Cette procédure peut être utile pour les serveurs qui utilisent un autre port du trafic client normal pour écouter une requête de conseiller.
Dans cet exemple, un serveur écoute sur le port 11999 et, lorsqu'il est interrogé, renvoie une valeur de charge avec l'entier hexadécimal "4". Cet exemple est exécuté en mode remplacement (le dernier paramètre du constructeur du conseiller a la valeur true) et le code de base du conseiller utilise la valeur de charge renvoyée à la place du délai écoulé.
Notez l'appel de supressBaseOpeningSocket() dans la routine d'initialisation. La suppression du socket de base lorsqu'aucune donnée n'est envoyée n'est pas requise. Par exemple, vous pouvez ouvrir le socket pour vous assurer que le conseiller peut contacter le serveur. Examinez avec soin les besoins de votre application avant d'opter pour cette solution.
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; // create an array of bytes with the load request message 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); // replace mode parameter is true super.setAdvisor( this ); } //-------- // ADV_AdvisorInitialize public void ADV_AdvisorInitialize() { suppressBaseOpeningSocket(); // tell base code not to open the // standard socket return; } //-------- // getLoad public int getLoad(int iConnectTime, ADV_Thread caller) { int iRc; int iLoad = ADV_HOST_INACCESSIBLE; // -1 int iControlPort = 11999; // port on which to communicate // with the server String sServer = caller.getCurrentServerId(); // address of server to query try { socket soServer = new Socket(sServer, iControlPort); // open socket to // server DataInputStream disServer = new DataInputStream( soServer.getInputStream()); DataOutputStream dosServer = new DataOutputStream( soServer.getOutputStream()); int iRecvTimeout = 10000; // set timeout (in milliseconds) // for receiving data soServer.setSoTimeout(iRecvTimeout); dosServer.writeInt(4); // send a message to the server dosServer.flush(); iLoad = disServer.readByte(); // receive the response from the server } catch (exception e) { system.out.println("Caught exception " + e); } return iLoad; // return the load reported from the server } }