Das folgende Beispiel zeigt, wie ein Advisor für Nebendatenströme implementiert werden kann. Das Beispiel veranschaulicht, wie der vom Advisorbasiscode geöffnete Standardsocket unterdrückt wird. Stattdessen öffnet dieser Advisor für die Abfrage eines Servers einen Java-Socket für Nebendatenströme. Diese Vorgehensweise kann für Server hilfreich sein, die für eine Advisorabfrage einen anderen Port als für den normalen Clientdatenverkehr verwenden.
In diesem Beispiel ist ein Server an Port 11999 empfangsbereit 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 Advisorkonstruktors wird auf true gesetzt, und der Advisorbasiscode verwendet den zurückgegebenen Lastwert anstelle der abgelaufenen Zeit.
Beachten Sie den Aufruf von supressBaseOpeningSocket() in der Initialisierungsroutine. Eine Unterdrückung des Basissockets ist nicht erforderlich, wenn keine Daten gesendet werden. Sie können den Socket beispielsweise öffnen, um sicherzustellen, dass der Advisor 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;
// Eine Bytefeldgruppe mit der Ladeanforderungsnachricht erstellen
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
// Standardsocket 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 Servers, der abgefragt werden soll
try {
socket soServer = new Socket(sServer, iControlPort); // Socket für
// 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
}
}