I seguenti esempi mostrano il modo in cui è possibile implementare gli advisor personalizzati.
Un advisor personalizzato di esempio per WebSphere Application Server è incluso nella directory
root_install/servers/samples/CustomAdvisors/. Il codice completo non è duplicato in questo documento. Verificare che verrà implementato quanto riportato di seguito:
- ADV_was.java è il file del codice sorgente dell'advisor compilato ed eseguito sulla macchina Load Balancer.
- LBAdvisor.java.servlet è il codice sorgente del servlet che deve essere ridenominato in LBAdvisor.java, compilato ed eseguito sulla macchina di WebSphere Application Server.
L'advisor completo è leggermente più complesso rispetto all'esempio. Esso aggiunge una routine di analisi specializzata che è più compatta dell'esempio StringTokenizer
riportata nella sezione Esempio: Utilizzo dei dati restituiti dagli advisor.
La parte più complessa del codice di esempio si trova nel servlet Java. Tra gli altri metodi, il servlet contiene due metodi richiesti dalla specifica servlet,
init() e service(), e un metodo, run(), richiesto dalla classe Java.lang.thread.
- Il metodo init() viene richiamato solo una volta dal motore del servlet in fase di inizializzazione. Questo metodo crea un thread denominato _checker che viene eseguito indipendentemente dalle chiamate dall'advisor e viene interrotto per un periodo di tempo prima di riprendere il loop di elaborazione.
- Il metodo service() viene richiamato dal motore del servlet ogni volta che viene richiamato il servlet.
In questo caso, il metodo viene richiamato dall'advisor. Il metodo service() invia un flusso
di caratteri ASCII a un flusso di output.
- Il metodo run() contiene la parte principale di esecuzione del codice. Esso viene richiamato dal metodo start()
che a sua volta viene richiamato dal metodo init().
Di seguito sono riportati i frammenti rilevanti del codice del servlet:
...
public void init(ServletConfig config) throws ServletException {
super.init(config);
...
_checker = new Thread(this);
_checker.start();
}
public void run() {
setStatus(GOOD);
while (true) {
if (!getKeepRunning())
return;
setStatus(figureLoad());
setLastUpdate(new java.util.Date());
try {
_checker.sleep(_interval * 1000);
} catch (Exception ignore) { ; }
}
}
public void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
ServletOutputStream out = null;
try {
out = res.getOutputStream();
} catch (Exception e) { ... }
...
res.setContentType("text/x-application-LBAdvisor");
out.println(getStatusString());
out.println(getLastUpdate().toString());
out.flush(); return;
}
...