A continuación se muestra un archivo de asesor de ejemplo denominado ADV_sample.
/ * * * ADV_sample: Asesor HTTP de Load Balancer * * * Esta clase define un asesor personalizado de ejemplo para Load Balancer. Como todos * los asesores, este asesor personalizado amplía la función de la base del * asesor, denominada ADV_Base. Es la base del asesor que en realidad realiza la * mayoría de las funciones del asesor, como informar de las cargas a Load Balancer * para su uso en el algoritmo de peso de Load Balancer. La base del asesor también * realiza operaciones de cierre y conexión de sockets, y proporciona métodos * de envío y recepción para que el asesor los emplee. El asesor sólo se utiliza * para enviar y recibir datos del puerto del servidor que se está asesorando. * Se calcula la duración de los métodos TCP incluidos en la base del asesor para * calcular la carga. Un distintivo interno del constructor de ADV_base escribe * sobre la carga existente la nueva carga devuelta desde el asesor, si se desea. * * Nota: en función de un valor fijado en el constructor, la base del asesor * suministra la carga al algoritmo de peso a intervalos especificados. Si el * asesor real no se ha completado y puede devolver una carga válida, la base del * asesor utiliza la carga anterior. * * DENOMINACIÓN * * El convenio de denominación es el siguiente: * * - El archivo debe estar en el siguiente directorio de Load Balancer: * * ulb/servers/lib/CustomAdvisors/ (ulb\servers\lib\CustomAdvisors en Windows) * * - El nombre del asesor debe ir precedido de "ADV_". Sin embargo, el asesor * sólo puede empezar con el nombre; por ejemplo, el asesor "ADV_sample" * puede empezar con "sample". * * - El nombre del asesor debe indicarse en minúsculas. * * Por lo tanto, teniendo presente estas reglas, este ejemplo se denomina: * * <directorio base="">/lib/CustomAdvisors/ADV_sample.class * * * Los asesores, al igual que el resto de Load Balancer, deben compilarse con la * versión prereq de Java. Para garantizar el acceso a las clases de Load Balancer, * asegúrese de que el archivo ibmlb.jar (que se encuentra en el subdirectorio lib * del directorio base) está incluido en la CLASSPATH del sistema. * * Métodos proporcionados por ADV_Base: * * - ADV_Base (Constructor): * * - Parámetros * - String sName = Nombre del asesor * - String sVersion = Versión del asesor * - int iDefaultPort = Número de puerto predeterminado sobre el que asesorar * - int iInterval = Intervalo sobre el que asesorar sobre los servidores * - String sDefaultName = No se utiliza. Debe pasarse como "". * - boolean replace = True - sustituye el valor de carga que calcula * la base del asesor * False - añade el valor de carga que calcula * la base del asesor * - Retorno * - Los constructores no tienen valores de retorno. * * Puesto que la base del asesor se basa en hebras, tiene otros métodos * disponibles que un asesor puede usar. Se puede hacer referencia a estos métodos * con el parámetro CALLER pasado en getLoad(). * * Estos métodos son los siguientes: * * - send - Envía un paquete de información en la conexión de socket establecida * al servidor del puerto especificado. * - Parámetros * - String sDataString - Los datos que deben enviar en el formato de serie * - Retorno * - int RC - Determina si los datos se han enviado satisfactoriamente; cero indica que * los datos se han enviado; un entero negativo indica un error. * * - receive - Recibe información de la conexión del socket. * - Parámetros * - StringBuffer sbDataBuffer - Los datos recibidos durante la llamada de recepción * - Retorno * - int RC - Determina si los datos se recibieron satisfactoriamente; cero * indica que los datos se enviaron; un entero negativo indica * un error. * * Si la función que proporciona la base del asesor no es suficiente, * puede crear la función adecuada dentro del asesor y * se ignorarán los métodos que proporciona la base del asesor. * * Una pregunta importante en relación a la carga devuelta es si se debe aplicar * a la carga que se genera dentro de la base del asesor, * o se debe sustituir; hay instancias válidas para las dos situaciones. * * Este ejemplo es fundamentalmente el asesor HTTP de Load Balancer. Funciona de una * forma muy simple: se emite una petición de envío: una petición de cabecera HTTP. * Una vez que se recibe la respuesta, el método getLoad finaliza, indicando a la * base del asesor que detenga la medición del tiempo de la petición. Entonces el * método finaliza. La información devuelta no se analiza; la carga se basa en el * tiempo necesario para realizar las operaciones de envío y recepción. */ package CustomAdvisors; import com.ibm.internet.nd.advisors.*; public class ADV_sample extends ADV_Base implements ADV_MethodInterface { String COPYRIGHT = "(C) Copyright IBM Corporation 1997, All Rights Reserved.\n"; static final String ADV_NAME = "Sample"; static final int ADV_DEF_ADV_ON_PORT = 80; static final int ADV_DEF_INTERVAL = 7; // Nota: la mayoría de los protocolos de servidor requieren un retorno de // carro ("\r") y un salto de línea ("\n") al final de los mensajes. // Si es así, inclúyalos en la serie aquí. static final String ADV_SEND_REQUEST = "HEAD / HTTP/1.0\r\nAccept: */ *\r\nUser-Agent: " + "IBM_Load_Balancer_HTTP_Advisor\r\n\r\n"; /** * Constructor. * * Parámetros: Ninguno; pero el constructor de ADV_Base tiene varios parámetros * que deben pasarse. * */ public ADV_sample() { super( ADV_NAME, "2.0.0.0-03.27.98", ADV_DEF_ADV_ON_PORT, ADV_DEF_INTERVAL, "", // no se utiliza false); super.setAdvisor( this ); } /** * ADV_AdvisorInitialize * * Se inicia cualquier inicialización específica del asesor que debe tener lugar * después de la base del asesor. Este método sólo se invoca una vez y * normalmente no se utiliza. */ public void ADV_AdvisorInitialize() { return; } /** * getLoad() * * La base del asesor llama a este método para completar la operación del * asesor, basándose en detalles específicos del protocolo. En este ejemplo del * asesor, sólo es necesario emitir un sólo envío y recepción; si es necesario * usar una lógica más compleja, se pueden emitir varios envíos y recepciones. * Por ejemplo, una respuesta puede recibirse y analizarse. Basándose en la * información que se obtiene, se podría emitir otro envío y recepción. * * Parámetros: * * - iConnectTime - La carga actual relativa al intervalo de tiempo que ha * tardado en llevarse a cabo la conexión con el servidor en * el puerto especificado. * * - caller - Una referencia a la clase base del asesor donde los métodos * que proporciona Load Balancer van a realizar peticiones TCP * sencillas, principalmente envíos y recepciones. * * Resultados: * * - La carga, un valor expresado en milisegundos, que puede añadirse a la * carga existente o que puede sustituir a la misma, según lo * determina el distintivo "replace" del constructor. * * Cuánto mayor sea la carga, más tiempo se necesitará para que el servidor * responda; por lo tanto, menor será el peso dentro de Load Balancer. * * Si el valor es negativo, se da por supuesto un error. Un error de un asesor * indica que el servidor al que el asesor intenta llegar no es accesible y * que se ha identificado como inactivo. Load Balancer no intentará equilibrar la * carga en un servidor que está inactivo. Load Balancer reanudará el equilibrado * de carga en el servidor cuando se reciba un valor positivo. * */ public int getLoad(int iConnectTime, ADV_Thread caller) { int iRc; int iLoad = ADV_HOST_INACCESSIBLE; // -1 // nviar petición TCP iRc = caller.send(ADV_SEND_REQUEST); if (iRc >= 0) { // Realizar una recepción StringBuffer sbReceiveData = new StringBuffer(""); iRc = caller.receive(sbReceiveData); /** * En una modalidad de asesor normal (el distintivo "replace" es false), la carga * devuelta es 0 o 1, lo que indica que el servidor está activo o inactivo. * Si la recepción es satisfactoria, se devuelve una carga de cero, lo * que indica que se va a usar la carga incluida dentro del asesor base. * * De lo contrario (el distintivo "replace" es true), devuelva el valor de carga que desee. */ if (iRc >= 0) { iLoad = 0; } } return iLoad; } } // Final de - ADV_sample