定制顾问程序是以类文件形式提供的一小段 Java™ 代码,由负载均衡器基本代码调用以确定服务器上的负载。基本代码提供了所有必要的管理服务,包括启动和停止定制顾问程序的实例、提供状态和报告、将历史记录信息记录在日志文件中以及向管理器组件报告顾问程序结果。
可以将定制顾问程序设计为以正常方式或替换方式与负载均衡器交互。
将在定制顾问程序文件中以构造方法中参数的形式指定运行方式选项。(每个顾问程序根据其设计仅以其中一种方式运行。)
在正常方式下,定制顾问程序与服务器交换数据,而基本顾问程序代码则对该交换进行计时并计算负载值。然后基本代码向管理器报告此负载值。定制顾问程序返回值零以指示成功,或返回负值以指示发生了错误。
要指定正常方式,请将构造函数中的替换标志设置为 false。
在替换方式下,基本代码不执行任何计时测量。定制顾问程序代码根据其唯一需求执行所指定的任何操作,然后返回实际负载数字。基本代码接受负载数字并将其不作改变地向管理器报告。要获取最佳效果,请将负载数字在 10 与 1000 之间进行常规调整,10 表示快速服务器,1000 表示慢速服务器。
要指定替换方式,请将构造函数中的替换标志设置为 true。
定制顾问程序文件名必须遵循格式 ADV_名称.java,其中名称是您为顾问程序选择的名称。完整名称必须以大写字母的前缀 ADV_ 开头,并且所有后续字符都必须为小写字母。小写字母的要求确保运行顾问程序的命令不区分大小写。
根据 Java 约定,文件中定义的类的名称必须与文件的名称匹配。
必须使用 Java 语言编写定制顾问程序并且使用与负载均衡器代码相同级别的 Java 编译器编译这些顾问程序。要检查系统上 Java 的版本,请从 install_path/java/bin 目录运行以下命令:
java -fullversion
如果当前目录不是您的路径的一部分,那么需要指定应该从当前目录运行 Java 以确保获得正确的版本信息。在这种情况下,请从 install_path/java/bin 目录运行以下命令:
./java -fullversion
编译期间将引用下列文件:
编译期间,classpath 环境变量必须指向定制顾问程序文件和基类文件。编译命令可能具有以下格式:对于 UNIX Windows 系统,样本编译命令如下:
install_path/java/bin/javac -classpath /opt/ibm/edge/lb/servers/lib/ibmlb.jar ADV_name.java
其中:
编译的输出是一个类文件,例如,ADV_name.class。在启动顾问程序之前,请将该类文件复制到 install_path/servers/lib/CustomAdvisors/ 目录。
要运行定制顾问程序,必须首先将顾问程序的类文件复制到负载均衡器机器上的 lib/CustomAdvisors/ 子目录。对于名为 myping 的定制顾问程序,文件路径为 install_path/servers/lib/CustomAdvisors/ADV_myping.class
配置负载均衡器、启动其管理器功能并发出启动定制顾问程序的命令。将通过名称来指定定制顾问程序,不包括 ADV_ 前缀和文件扩展名:
dscontrol advisor start myping port_number
命令中指定的端口号是顾问程序将在其上打开与目标服务器的连接的端口。
像所有顾问程序一样,定制顾问程序扩展名为 ADV_Base 的顾问程序基类的功能。顾问程序基类执行顾问程序的大多数功能,例如向管理器报告负载以在管理器的权重算法中使用。顾问程序基类还执行套接字连接和关闭操作,并提供发送和接收方法供顾问程序使用。顾问程序仅用于在正被调查的服务器的指定端口上发送和接收数据。顾问程序基类中提供的 TCP 方法将定时计算负载。顾问程序基类的构造函数中的一个标志将使用顾问程序返回的新负载覆盖现有负载(如果希望这样的话)。
顾问程序具有下列基类方法:
本节后面提供了关于这些必需例程的详细信息。
将在搜索了本机顾问程序或标准顾问程序之后调用定制顾问程序。如果负载均衡器在标准顾问程序列表中找不到指定的顾问程序,那么它将查找定制顾问程序列表。可以在 WebSphere® Application Server 负载均衡器 Administration Guide 中找到有关使用顾问程序的其他信息。
请记住定制顾问程序名称和路径的下列要求。
public <advisor_name> (
String sName;
String sVersion;
int iDefaultPort;
int iInterval;
String sDefaultLogFileName;
boolean replace
)
void ADV_AdvisorInitialize()
提供此方法是为了执行定制顾问程序可能需要的任何初始化。将在顾问程序基本模块启动之后调用此方法。
在许多情况下,包括标准顾问程序在内,未使用此方法,并且其代码仅包含 return 语句。可以使用此方法来调用 suppressBaseOpeningSocket 方法,后者仅在此方法内有效。
int getLoad(
int iConnectTime;
ADV_Thread *caller
)
可以从定制顾问程序中调用下列各节中描述的方法或函数。顾问程序基本代码支持这些方法。
可以直接调用其中某些函数,例如,function_name(),但其他函数需要前缀 caller。Caller 表示支持正在执行的定制顾问程序的基本顾问程序实例。
ADVLOG 函数允许定制顾问程序将文本消息写入顾问程序基本日志文件。格式如下:
void ADVLOG (int logLevel, String message)
getAdvisorName 函数返回一个带有定制顾问程序名称的后缀部分的 Java 字符串。例如,对于名为 ADV_cdload.java 的顾问程序,此函数返回值 cdload。
此函数不带任何参数。
注意,在顾问程序的实例化期间,无法更改此值。
getAdviseOnPort 函数返回运行调用定制顾问程序所使用的端口号。返回值是一个 Java 整数 (int),并且该函数不带任何参数。
注意,在顾问程序的实例化期间,无法更改此值。
getCurrentServerId 函数返回一个 Java 字符串,该字符串是当前服务器的唯一表示。
通常情况下,每当您调用定制顾问程序时,此值都会更改,这是因为顾问程序基本代码会连续查询所有服务器。
此函数不带任何参数。
getCurrentClusterId 函数调用返回一个 Java 字符串,该字符串是当前集群的唯一表示。
通常情况下,每当您调用定制顾问程序时,此值都会更改,这是因为顾问程序基件会连续查询所有集群。
此函数不带任何参数。
getSocket 函数调用返回一个 Java 套接字,该套接字表示已对当前服务器打开以用于通信的套接字。
此函数不带任何参数。
getInterval 函数返回顾问程序时间间隔,即顾问程序循环之间的秒数。除非使用 dscontrol 命令在运行时修改了此值,否则此值等于定制顾问程序的构造函数中设置的缺省值。
返回值是一个 Java 整数。此函数不带任何参数。
getLatestLoad 函数允许定制顾问程序获取给定服务器对象的最新负载值。负载值由顾问程序基本代码和管理器守护程序保存在内部表中。
int caller.getLatestLoad (String clusterId, int port, String serverId)
三个自变量共同定义一个服务器对象。
返回值是一个整数。
如果要使一个协议或端口的行为依赖于另一个协议或端口的行为,那么此函数调用很有用。例如,您可以在禁用了特定应用程序服务器的定制顾问程序中使用此函数调用(如果在该同一台机器上禁用了 Telnet 服务器)。
receive 函数从套接字连接中获取信息。
caller.receive(StringBuffer *response)
参数 response 是一个字符串缓冲区,检索到的数据将放置在该缓冲区中。此外,此函数还会返回一个具有下列含义的整数值:
send 函数使用已建立的套接字连接通过指定的端口将数据包发送到服务器。
caller.send(String command)
参数 command 是包含要发送到服务器的数据的字符串。此函数返回一个具有下列含义的整数值:
suppressBaseOpeningSocket 函数调用允许定制顾问程序指定基本顾问程序代码是否为定制顾问程序打开与服务器的 TCP 套接字。如果顾问程序不使用与服务器的直接通信来确定其状态,那么可能不需要打开此套接字。
只能发出此函数调用一次,并且必须从 ADV_AdvisorInitialize 例程发出。
此函数不带任何参数。