L'exemple ci-après illustre l'implémentation d'un conseiller de flux latéral. Cet exemple montre 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 port différent par rapport au trafic client normal pour écouter un requête du conseiller.
Dans cet exemple, un serveur écoute le port 11999 et lorsqu'il est interrogé, il retourne 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 à supressBaseOpeningSocket() dans la routine d'initialisation. La suppression du socket de base lorsque aucune donnée n'est envoyée n'est pas nécessaire. Par exemple, vous pouvez ouvrir le socket pour que le conseiller puisse 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; // crée une matrice d'octets avec le message de demande de charge 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); // le paramètre du mode de remplacement a la valeur true super.setAdvisor( this ); } //-------- // ADV_AdvisorInitialize public void ADV_AdvisorInitialize() { suppressBaseOpeningSocket(); // demande au code de base d'ouvrir le socket // standard return; } //-------- // getLoad public int getLoad(int iConnectTime, ADV_Thread caller) { int iRc; int iLoad = ADV_HOST_INACCESSIBLE; // -1 int iControlPort = 11999; // port de communication // avec le serveur String sServer = caller.getCurrentServerId(); // adresse du serveur à interroger try { socket soServer = new Socket(sServer, iControlPort); // ouvre le socket sur // le serveur DataInputStream disServer = new DataInputStream( soServer.getInputStream()); DataOutputStream dosServer = new DataOutputStream( soServer.getOutputStream()); int iRecvTimeout = 10000; // définit le délai (en millisecondes) // de réception des données soServer.setSoTimeout(iRecvTimeout); dosServer.writeInt(4); // envoie un message au serveur dosServer.flush(); iLoad = disServer.readByte(); // reçoit une réponse du serveur } catch (exception e) { system.out.println("Caught exception " + e); } return iLoad; // retourne la charge indiquée par le serveur } }