Il s'agit d'un exemple de fichier de conseiller appelé ADV_sample.
/ * * * ADV_sample : Conseiller HTTP de 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 de connexion et de fermeture * de la connexion et fournit des méthodes d'envoi et de réception qui seront * utilisées par le conseiller. Le conseiller n'est lui-même utilisé que pour * l'envoi de données vers le port du serveur conseillé et pour la réception * de données sur ce dernier. Les méthodes TCP de la base du conseiller sont * programmées pour calculer 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 : en fonction d'une valeur définie dans le constructeur, la base * du conseiller fournit la charge à l'algorithme de pondération à un * intervalle donné. 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. * CONVENTION DE DENOMINATION * * 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 sous 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 gardant ces règles à l'esprit, notre exemple s'intitule donc : * * <répertoire de base="">/lib/CustomAdvisors/ADV_sample.class * * * Les conseillers, comme les autres composants de Load Balancer, doivent être * compilés avec la version prérequise de 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éthodes fournies par ADV_Base : * * - ADV_Base (Constructeur) : * * - Paramètres * - Chaîne sName = Nom du conseiller * - Chaîne sVersion = Version du conseiller * - Entier iDefaultPort = Numéro de port par défaut pour les conseils * - Entier iInterval = Intervalle des conseils sur les serveurs * - Chaîne sDefaultName = Inutilisée. Doit être transmise sous la forme "". * - Booléen replace = True - Remplace la valeur de charge calculée par la * base du conseiller * False - S'ajoute à la valeur de charge calculée * par la base du conseiller * - Retour * - Les constructeurs ne possèdent pas de valeurs de retour. * * La base du conseiller étant basée sur une arborescence, * le conseiller a de nombreuses autres méthodes qui peuvent ê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 se présentent comme suit : * * - send - Envoie au serveur un paquet de données concernant la connexion de * socket établie, sur le port spécifié. * - Paramètres * - Chaîne sDataString - Données à envoyer sous forme de chaîne * - Retour - Entier RC - Indique si les données ont été envoyées ou non : zéro indique * que les données ont été envoyées ; un entier négatif indique une erreur. * * - receive - Reçoit des informations de la connexion socket. * - Paramètres * - Chaîne Buffer sbDataBuffer - Données reçues lors de l'appel de réception * - Retour * - Entier RC - Indique si les données ont été reçues ou non ; zéro indique * que les données ont été envoyées ; un entier négatif indique * 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 ; les méthodes * fournies par la base du conseiller seront alors ignorées. * * Il faut ensuite déterminer si la charge renvoyée doit être appliquée à la * charge générée dans la base du conseiller ou remplacée ; il existe des * instances valides de ces deux cas. * * Cet exemple concerne principalement le conseiller HTTP de 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. Les informations renvoyées ne sont pas * analysées ; la charge est fonction du temps nécessaire pour effectuer 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; // Note: Most server protocols require a carriage return ("\r") and line // feed ("\n") at the end of messages. If so, include them in // your string here. 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 d'ADV_Base possède 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 spécifique au conseiller qui doit être mise * en oeuvre 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, à partir de détails spécifiques au 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. Par * exemple, une réponse peut être 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 - La charge actuelle car elle fait référence au temps * écoulé pour établir la connexion au serveur via le * port spécifié. * * - caller - Une référence à la classe de la base du conseiller * dans laquelle les méthodes fournies par Load Balancer doivent * effectuer des demandes TCP simples (principalement des envois et des * réceptions). * * Résultats : * * - Charge - Valeur exprimée en millisecondes, pouvant être ajoutée * à la charge existante ou pouvant la remplacer, selon la valeur de * l'option "replace" du constructeur. * * Plus la charge est importante, plus le serveur met de temps à * répondre et donc plus la charge de Load Balancer diminue. * * Si la valeur est négative, il s'agit d'une erreur. 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) { // Perform a receive StringBuffer sbReceiveData = new StringBuffer(""); iRc = caller.receive(sbReceiveData); /** * Dans le mode de conseiller normal (l'option "replace" a la valeur * false), la charge renvoyée est 0 ou 1, ce qui indique 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 (l'indicateur "replace" a la valeur true), la valeur de * charge souhaitée est renvoyée. */ if (iRc >= 0) { iLoad = 0; } } return iLoad; } } // End - ADV_sample