示例: 实现 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; 
} 
...