En el ejemplo siguiente se muestra cómo se implementa un asesor en la corriente. En este ejemplo se muestra la supresión del socket estándar que la base del asesor ha abierto. En su lugar, el asesor abre un socket Java en la corriente para consultar un servidor. Este procedimiento puede resultar de utilidad para los servidores que utilizan un puerto distinto del tráfico de cliente normal para realizar la escucha de una consulta del asesor.
En este ejemplo, un servidor está a la escucha en el puerto 11999 y cuando se le consulta devuelve un valor de carga con un entero hexadecimal "4". Este ejemplo se ejecuta en modalidad de sustitución, es decir, el último parámetro del constructor del asesor se establece en true y el código base del asesor utiliza el valor de carga devuelto en lugar del tiempo transcurrido.
Observe la llamada a supressBaseOpeningSocket() en la rutina de inicialización. No es necesario suprimir el socket base cuando no se van a enviar datos. Por ejemplo, quizá desee abrir el socket para asegurarse de que el asesor se puede poner en contacto con el servidor. Examine las necesidades de la aplicación cuidadosamente antes de hacer esta elección.
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; // crear una matriz de bytes con el mensaje de solicitud de carga 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); // el parámetro de modalidad de sustitución es true super.setAdvisor( this ); } //-------- // ADV_AdvisorInitialize public void ADV_AdvisorInitialize() { suppressBaseOpeningSocket(); // indicar al código base que no abra // el socket estándar return; } //-------- // getLoad public int getLoad(int iConnectTime, ADV_Thread caller) { int iRc; int iLoad = ADV_HOST_INACCESSIBLE; // -1 int iControlPort = 11999; // puerto en el que se comunica // con el servidor String sServer = caller.getCurrentServerId(); // dirección de servidor para consulta try { socket soServer = new Socket(sServer, iControlPort); // abrir socket en // servidor DataInputStream disServer = new DataInputStream( soServer.getInputStream()); DataOutputStream dosServer = new DataOutputStream( soServer.getOutputStream()); int iRecvTimeout = 10000; // establecer tiempo de espera (milisegundos) // para recibir datos soServer.setSoTimeout(iRecvTimeout); dosServer.writeInt(4); // enviar un mensaje al servidor dosServer.flush(); iLoad = disServer.readByte(); // recibir la respuesta del servidor } catch (exception e) { system.out.println("Caught exception " + e); } return iLoad; // devolver la carga notificada del servidor } }