Il s'agit d'un exemple de fichier de conseiller appelé ADV_sample.
/ * * * ADV_sample : conseiller HTTP Load Balancer * * * Cette classe définit un exemple de conseiller personnalisé pour Load Balancer. * Comme tous les conseillers, le conseiller personnalisé étend la fonction de * la base du conseiller, intitulée ADV_Base. En fait, c'est la base du * conseiller qui effectue la plupart des fonctions du conseiller, telles que * la communication des charges à Load Balancer afin que ces dernières soient * utilisées dans l'algorithme de pondération de Load Balancer. La base * du conseiller effectue également les opérations d'ouverture et de * fermeture de socket et fournit des méthodes d'envoi et de * réception au conseiller. Le conseiller lui-même permet uniquement * d'envoyer et de recevoir des données vers et depuis le port du serveur * avisé. Les méthodes TCP de la base de l'assistant sont programmées pour calculer la * la charge. Un indicateur du constructeur de ADV_base remplace, si vous le souhaitez, * la charge existante par la nouvelle charge renvoyée par le conseiller. * * Remarque : selon la valeur définie dans le constructeur, la base du conseiller * fournit la charge à l'algorithme de pondération à une fréquence donnée. Si le véritable conseiller n'a pas terminé ses opérations * afin de renvoyer une charge valide, la base du conseiller utilise la charge * précédente. * * DESIGNATION * * La convention de dénomination est la suivante : * * - Le fichier doit se trouver dans le répertoire Load Balancer suivant : * * ulb/servers/lib/CustomAdvisors/ (ulb\servers\lib\CustomAdvisors sur Windows) * * - Le nom du conseiller doit être précédé de "ADV_". Le conseiller peut * cependant n'être démarré qu'avec son nom. Par exemple, le conseiller * "ADV_sample" peut être démarré en entrant "sample". * * - Le nom du conseiller doit être en minuscules. * * En tenant compte de ces règles, cet exemple est : * * <base directory="">/lib/CustomAdvisors/ADV_sample.class * * * Les conseillers, comme pour le reste de Load Balancer, doivent être compilés avec * la version prérequise Java. Pour que les classes Load * Balancer soient accessibles, assurez-vous que le fichier ibmlb.jar (situé * dans le sous-répertoire lib du répertoire de base) est inclus dans la * variable CLASSPATH du système. * * Méthode fournie par ADV_Base : * * - ADV_Base (constructeur) : * * - Parms * - String sName = Nom du conseiller * - String sVersion = Version du conseiller * - int iDefaultPort = Numéro de port par défaut pour les conseils * - int iInterval = Fréquence des conseils sur les serveurs * - String sDefaultName = Non utilisé. Doit être transmise sous la forme "". * - boolean replace = True - remplacement de la valeur de la charge * par la base du conseiller * False - ajout à la valeur de la charge calculée * par la base du conseiller * - Return * - Les constructeurs n'ont pas de valeurs de retour. * * La base du conseiller étant basée sur une unité d'exécution, elle dispose de plusieurs autres méthodes * pouvant être utilisées par un conseiller. Ces méthodes peuvent être référencées à l'aide du paramètre * CALLER transmis dans la méthode getLoad(). * * Ces méthodes sont les suivantes : * * - send - Envoie un paquet d'informations sur la connexion de socket établie * sur le serveur sur le port défini. * - Parms * - String sDataString - Les données à envoyer se présentent sous forme de chaîne * - Return * - int RC - Indique si les données ont été correctement envoyées ; * un zéro indique que les données ont été envoyées ; un * entier négatif indique une erreur. * * - receive - Reçoit les informations de la connexion de socket. * - Parms * - StringBuffer sbDataBuffer - Données reçues pendant l'appel * - Return * - int RC - Indique si les données ont été correctement * reçues ; zéro indique que les données ont été * reçues et un entier négatif signale une * erreur. * * Si la fonction fournie par la base du conseiller n'est pas suffisante, * vous pouvez créer la fonction appropriée dans le conseiller et * les méthodes fournies par la base du conseiller sont alors ignorées. * * Une question essentielle concernant la charge retournée consiste à savoir si elle doit être appliquée * à la charge générée dans la base du conseiller ou * remplacée. Les deux situations peuvent exister. * * Cet exemple porte essentiellement sur le conseiller HTTP Load Balancer. Il * fonctionne très simplement : une demande d'envoi (demande http principale) * est émise. Dès que la réponse est reçue, la méthode getLoad est arrêtée et la * base du conseiller arrête alors de calculer la durée de la demande. La * méthode est alors terminée. La * informations renvoyées ne sont pas * analysées ; la charge dépend du délai nécessaire * pour exécuter les opérations d'envoi et de réception. */ 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; // Remarque : La plupart des protocoles de serveur // requièrent un retour chariot ("\r") et un passage à // la ligne ("\n") à la fin des messages. Si tel est le // cas, incluez-les dans la chaîne ci-dessous. static final String ADV_SEND_REQUEST = "HEAD / HTTP/1.0\r\nAccept: */*\r\nUser-Agent: " + "IBM_Load_Balancer_HTTP_Advisor\r\n\r\n"; /** * Constructeur. * * Paramètres : aucun, mais le constructeur pour ADV_Base a plusieurs paramètres * qui doivent lui être transmis. * */ 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 * * Toute initialisation de conseiller qui doit être exécutée * après le démarrage de la base du conseiller. * Cette méthode n'est appelée qu'une seule fois et n'est généralement * pas utilisée. */ public void ADV_AdvisorInitialize() { return; } /** * getLoad() * * Cette méthode est appelée par la base du conseiller pour terminer * l'opération du conseiller en fonction des informations du protocole. * Dans cet exemple de conseiller, une seule opération d'envoi et de * réception est nécessaire ; si une logique plus complexe est nécessaire, * il est possible d'émettre des envois et réceptions multiples. Pour * reçue et sa syntaxe peut être analysée. Sur la base * des informations obtenues, un autre ordre d'envoi et de * réception peut alors être émis. * * Paramètres : * * - iConnectTime - Charge actuelle qui fait référence à la durée d'exécution de * la connexion au serveur via le * port défini. * * - caller - Référence à la classe de la base du conseiller où les méthodes * fournies par le Charge Balancer doivent exécuter des demandes TCP simples, * à savoir des demandes d'envoi et de réception, principalement. * * Résultats : * * - Charge : valeur exprimée en millisecondes, pouvant être ajoutée * à la charge existante ou remplacée par cette dernière, conformément à la balise * "replace" du constructeur. * * Plus la charge est importante, plus le serveur répond lentement. * Par conséquent, la pondération est d'autant plus basse dans le Load Balancer. * * Si la valeur est négative, cela implique qu'une erreur s'est produite. Une erreur du * conseiller indique que le serveur auquel le conseiller tente * d'accéder n'est pas accessible et a été identifié comme étant arrêté. * Load Balancer ne tentera pas d'équilibrer un serveur arrêté. Load * Balancer recommencera à équilibrer la charge du serveur à la réception * d'une valeur positive. * */ 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) { // exécute une réception StringBuffer sbReceiveData = new StringBuffer(""); iRc = caller.receive(sbReceiveData); /** * En mode conseiller normal (la balise "replace" a la valeur false), la charge retourne la valeur * 0 ou 1 pour indiquer que le serveur est actif ou arrêté. * En cas de bonne réception, une charge de zéro est renvoyée pour * indiquer que la charge élaborée dans la base du conseiller n'est pas utilisée. * * Sinon (la balise "replace" a la valeur true), retourne la valeur de charge désirée. */ if (iRc >= 0) { iLoad = 0; } } return iLoad; } } // End - ADV_sample