Das folgende Beispiel zeigt, wie eine Advisor-Funktion für Nebendatenströme implementiert werden kann. Das Beispiel veranschaulicht, wie der vom Advisor-Basiscode geöffnete Standard-Socket unterdrückt wird. Stattdessen öffnet diese Advisor-Funktion für die Abfrage eines Servers einen Java-Socket für Nebendatenströme. Diese Prozedur kann für Server hilfreich sein, die für eine Advisor-Abfrage einen anderen Port als für den normalen Clientdatenverkehr verwenden.
In diesem Beispiel ist ein Server an Port 11999 empfangsbereicht und gibt bei Abfrage einen Lastwert mit dem hexadezimalen Integer "4" zurück. Dieser Beispielcode wird im Ersetzungsmodus ausgeführt, d. h., der letzte Parameter des Advisor-Konstruktors wird auf "true" gesetzt, und der Advisor-Basiscode verwendet den zurückgegebenen Lastwert anstelle der abgelaufenen Zeit.
Beachten Sie den Aufruf von supressBaseOpeningSocket() in der Initialisierungsroutine. Eine Unterdrückung des Basis-Sockets ist nicht erforderlich, wenn keine Daten gesendet werden. Sie können den Socket beispielsweise öffnen, um sicherzustellen, dass die Advisor-Funktion eine Verbindung zum Server herstellen kann. Überprüfen Sie die Anforderungen Ihrer Anwendung sorgfältig, bevor Sie diese Auswahl treffen.
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; // create an array of bytes with the load request message 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); // Parameter für Ersetzungsmodus ist true super.setAdvisor( this ); } //-------- // ADV_AdvisorInitialize public void ADV_AdvisorInitialize() { suppressBaseOpeningSocket(); // Basiscode anweisen, den // Standard-Socket nicht zu öffnen return; } //-------- // getLoad public int getLoad(int iConnectTime, ADV_Thread caller) { int iRc; int iLoad = ADV_HOST_INACCESSIBLE; // -1 int iControlPort = 11999; // Port, über den mit dem Server // kommuniziert werden soll String sServer = caller.getCurrentServerId(); // Adresse des abzufragenden Servers try { socket soServer = new Socket(sServer, iControlPort); // Socket zum Server // öffnen DataInputStream disServer = new DataInputStream( soServer.getInputStream()); DataOutputStream dosServer = new DataOutputStream( soServer.getOutputStream()); int iRecvTimeout = 10000; // Zeitlimit (in Millisekunden) // für den Empfang von Daten festlegen soServer.setSoTimeout(iRecvTimeout); dosServer.writeInt(4); // Nachricht an den Server senden dosServer.flush(); iLoad = disServer.readByte(); // Antwort vom Server empfangen } catch (exception e) { system.out.println("Caught exception " + e); } return iLoad; // Vom Server gemeldete Last zurückgeben } }