示例: 实现 WAS 顾问程序
以下示例显示如何实现定制顾问程序。
WebSphere Application Server 的样本定制顾问程序包含在 install_root/servers/samples/CustomAdvisors/ 目录中。 此文档中未复制完整代码。 确保将实施以下操作:
- ADV_was.java 是在负载均衡器机器上编译并运行的顾问程序源代码文件。
- LBAdvisor.java.servlet 是必须重命名为 LBAdvisor.java ,编译并在 WebSphere Application Server 机器上运行的 servlet 源代码。
完整的顾问程序仅比样本稍微复杂一些。 它添加了比主题 示例: 使用从顾问程序返回的数据中显示的 StringTokenizer 示例更紧凑的专用解析例程。
样本代码的更复杂部分在 Java servlet 中。 在其他方法中, servlet 包含 servlet 规范所需的两种方法 :init () 和 service () ,以及 Java.lang.thread 类所需的一种方法 run ()。
- init () 由 servlet 引擎在初始化时调用一次。 此方法创建名为 _checker 的线程,该线程独立于来自顾问程序的调用运行,并在恢复其处理循环之前休眠一段时间。
- 每次调用 servlet 时, servlet 引擎都会调用 service ()。 在这种情况下,该方法由顾问程序调用。 service () 方法将 ASCII 字符流发送到输出流。
- run () 包含代码执行的核心。 它由从 init () 方法中调用的 start () 方法调用。
以下示例中显示了 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;
}
...