O seguinte exemplo demonstra como um orientador de fluxo lateral pode ser implementado. Essa amostra ilustra a supressão do soquete padrão aberto pelo orientador base. Em vez disso, esse orientador abre um soquete Java de fluxo lateral para consultar um servidor. Esse procedimento pode ser útil para servidores que usam uma porta diferente do tráfego normal do cliente para atender a uma consulta do orientador.
Nesse exemplo, um servidor está atendendo na porta 11999 e quando consultado, retorna um valor de carregamento com um número inteiro hexadecimal "4". Essa amostra é executada no modo de substituição, ou seja, o último parâmetro do construtor do orientador é configurado para true e o código base do orientador usa o valor de carregamento retornado em vez do tempo decorrido.
Note a chamada de supressBaseOpeningSocket() na rotina de inicialização. Suprimir o soquete base quando nenhum dado for enviado não é necessário. Por exemplo, você pode querer abrir o soquete para assegurar que o orientador pode entrar em contato com o servidor. Examine as necessidades do seu aplicativo com cuidado antes de fazer essa escolha.
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; // criar uma matriz de bytes com a mensagem de pedido de carregamento 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; // port on which to communicate // with the server String sServer = caller.getCurrentServerId(); // address of server to query 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); // send a message to the server dosServer.flush(); iLoad = disServer.readByte(); // receive the response from the server } catch (exception e) { system.out.println("Caught exception " + e); } return iLoad; // return the load reported from the server } }