以下の例では、サイド・ストリーム advisor を実装する方法を 示します。このサンプルでは、advisor の基本によってオープンされる標準ソケットの抑制を具体的に示しています。代わりの方法として、この advisor では、サイド・ストリーム Java ソケットをオープンして サーバーを照会します。通常のクライアント・トラフィックと異なるポートを使用して advisor 照会を listen するサーバーに対しては、このプロシージャーが有効です。
この例の場合、サーバーは、ポート 11999 上で listen しており、照会された時点で 16 進の int 「4」で 負荷値を戻します。このサンプルは、置換モードで実行されます。すなわち、advisor コンストラクターの最終パラメーターが true に 設定されていて、advisor の基本コードでは、経過時間ではなく戻された負荷値が使用されます。
初期化ルーチン内の supressBaseOpeningSocket() に対する呼び出しに注意してください。 データが送信されない場合の基本ソケットの抑制は 不要です。例えば、advisor がサーバーに接続できるかどうかを確認する際に、ソケットのオープンが必要になった場合 などです。この選択を行う前に、アプリケーションに必要なものを入念に調べてください。
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); // replace mode parameter is true
super.setAdvisor( this );
}
//--------
// ADV_AdvisorInitialize
public void ADV_AdvisorInitialize()
{
suppressBaseOpeningSocket(); // tell base code not to open the
// standard socket
return;
}
//--------
// getLoad
public int getLoad(int iConnectTime, ADV_Thread caller) {
int iRc;
int iLoad = ADV_HOST_INACCESSIBLE; // -1
int iControlPort = 11999; // サーバーとの通信で
// 使用するポート
String sServer = caller.getCurrentServerId(); // 照会対象のサーバーのアドレス
try {
socket soServer = new Socket(sServer, iControlPort); // open socket to
// server
DataInputStream disServer = new DataInputStream(
soServer.getInputStream());
DataOutputStream dosServer = new DataOutputStream(
soServer.getOutputStream());
int iRecvTimeout = 10000; // set timeout (in milliseconds)
// for receiving data
soServer.setSoTimeout(iRecvTimeout);
dosServer.writeInt(4); // サーバーにメッセージを送信します
dosServer.flush();
iLoad = disServer.readByte(); // サーバーからの応答を受信します
} catch (exception e) {
system.out.println("Caught exception " + e);
}
return iLoad; // return the load reported from the server
}
}