以下の例では、サイド・ストリーム 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 } }