A continuación se muestra un archivo de asesor de ejemplo denominado ADV_sample.
/ * *
* ADV_sample: Asesor HTTP de Load Balancer HTTP
*
*
* Esta clase define un asesor personalizado de ejemplo para Load Balancer. Al igual que todos los
* asesores, este asesor personalizado amplía la función de la base del asesor,
* denominada ADV_Base. La base del asesor efectúa 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 utilice. El asesor sólo se utiliza para
* enviar y recibir datos a y desde el puerto del servidor que se está
* asesorando. Los métodos TCP incluidos en la base del asesor se temporizan para calcular
* la carga. Un distintivo dentro del constructor en ADV_base sobrescribe la
* carga existente con la nueva carga devuelta desde el asesor, si se desea.
*
* Nota: en función de un valor establecido en el constructor, la base del asesor proporciona
* la carga al algoritmo de peso a intervalos especificados. Si el asesor real
* no se ha completado de forma que pueda devolver una carga válida, la base
* del asesor utiliza la carga anterior.
*
* DENOMINACIÓN
*
* La convención de denominación es la siguiente:
*
* - El archivo debe estar en el directorio siguiente de Load Balancer: *
* ulb/servers/lib/CustomAdvisors/ (ulb\servers\lib\CustomAdvisors en Windows)
*
* - El nombre del asesor debe ir precedido por "ADV_". El asesor se puede
* iniciar, no obstante, sólo con el nombre; por ejemplo el asesor "ADV_sample"
* se puede iniciar con "sample".
*
* - El nombre del asesor debe estar en minúsculas.
*
* Teniendo en cuenta estas reglas, se hace referencia a este ejemplo como:
*
* <base directory="">/lib/CustomAdvisors/ADV_sample.class
*
*
* Los asesores, al igual que el resto de Load Balancer, deben compilarse con la
* versión de requisito previo 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 * de la 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 en el que se asesorará
* - int iInterval = Intervalo en el que se asesorará sobre los servidores
* - String sDefaultName = No utilizado. Debe pasarse como "".
* - boolean replace = True - se sustituye el valor de carga que se calcula
* por la base del asesor
* False - se añade al valor de carga que se calcula
* por la base del asesor
* - Retorno
* - Los constructores no tienen valores de retorno. *
* Dado que la base del asesor se basa en hebras, tiene otros métodos
* disponibles para que los use un asesor. Se puede hacer referencia a estos métodos
* mediante 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 en el puerto especificado.
* - Parámetros
* - String sDataString - Los datos deben enviarse en formato de serie
* - Retorno
* - int RC - Indica si los datos se han enviado correctamente o no: cero indica
* que se han enviado; un entero negativo indica un error.
*
* - receive - Recibe información de la conexión de socket.
* - Parámetros
* - StringBuffer sbDataBuffer - Los datos recibidos durante la llamada de recepción
* - Retorno
* - int RC - Si los datos se han recibido correctamente o no; cero
* indica que los datos se recibieron; 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
* los métodos que proporcione la base del asesor se pasarán por alto. *
* Una cuestión importante en relación con la carga devuelta es si se aplica
* a la carga que se genera en la base del asesor
* o se sustituye; hay instancias válidas de ambas situaciones.
*
' Este ejemplo es básicamente el asesor HTTP de Load Balancer. Funciona
* de manera muy sencilla: se emite una solicitud de envío --una solicitud HTTP HEAD--. Una vez
* que se recibe una respuesta, el método getLoad termina y señala la base del asesor
* para que deje de temporizar la solicitud. Entonces el método se ha completado. 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, Reservados todos los derechos.\n"
static final String ADV_NAME = "Ejemplo";
static final int ADV_DEF_ADV_ON_PORT = 80;
static final int ADV_DEF_INTERVAL = 7;
// Nota: la mayoría de protocolos de servidor requieren un retorno de carro ("\r") y
// un avance de línea ("\n") al final de los mensajes. Si es así, inclúyalos en
// su serie.
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 a él. *
*/
public ADV_sample()
{
super( ADV_NAME,
"2.0.0.0-03.27.98",
ADV_DEF_ADV_ON_PORT,
ADV_DEF_INTERVAL,
"", // not used false);
super.setAdvisor( this );
}
/**
* ADV_AdvisorInitialize
*
* Se inicia cualquier inicialización específica de asesor que deba tener lugar
* después de iniciar la base del asesor. Sólo se llama a este método una vez y
* normalmente no se utiliza.
*/
public void ADV_AdvisorInitialize()
{
return;
}
/**
* getLoad()
*
* Se llama a este método mediante la base del asesor para completar
* el funcionamiento del asesor, según detalles específicos del protocolo. En este
* asesor de ejemplo, sólo se necesitan un envío y una recepción; si es necesaria
* una lógica más compleja, pueden emitirse varios envíos y recepciones. Por
* ejemplo, puede recibirse y analizarse una respuesta. Según la
* información aprendida así, pueden emitirse otro envío y recepción.
*
* Parámetros:
*
* - iConnectTime - La carga actual referida al período de tiempo que
* se tardó en completar la conexión con el servidor
* a través del puerto especificado.
*
* - caller - Una referencia a la clase de base del asesor donde los
* métodos proporcionados por Load Balancer deben realizar solicitudes TCP simples,
* 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 la carga existente, como
* determine el distintivo "replace" del constructor.
*
* Cuanto mayor sea la carga, más tiempo tardará el servidor en responder;
* 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 que el asesor intenta alcanzar no es
* accesible y se ha identificado como inactivo. Load Balancer
* intentará equilibrar la carga en un servidor 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
// Send tcp request iRc = caller.send(ADV_SEND_REQUEST);
if (iRc >= 0)
{
// Realizar una recepción
StringBuffer sbReceiveData = new StringBuffer("");
iRc = caller.receive(sbReceiveData);
/**
* En la modalidad de asesor normal (el valor del 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 correcta, se devuelve una carga de cero
* que indica que debe utilizarse la carga construida en el asesor base.
*
* De lo contrario (el valor del distintivo "replace" es true), devuelva el valor de carga deseado.
*/
if (iRc >= 0)
{
iLoad = 0;
}
}
return iLoad;
}
} // Fin de ADV_sample