如何取得tivoli性能监控器中的线程池数据(可以走soap调用系统管理的路线吗?)

sniper1990 2007-08-20
大家好,在下单位使用的websphere的版本是5.0.2,现在需要取得tivoli性能监控器中的线程池的并发活动线程数据作为负载均衡算法的一个算子,不知道该如何去做?
sniper1990 2007-08-20
正在看developerWork的一些资料,似乎可以通过soap的8880端口连接上服务器,似乎可以做到启动和停止服务器,也可以监听系统的事件,但是如何得到并发活动线程数,正在学习中,有什么进展再来和大家分享。
intolong 2007-08-20
tivoli有两百多个产品,你说的是哪个?
sniper1990 2007-08-21
你好,intolong。
我指的tivoli的产品是和websphere application 5.0安装时一起安装下去的tivoli性能查看器。
今天有了新的进展,可以通过如下代码连接到websphere:
AdminClient adminclient =null;
java.util.Properties props = new java.util.Properties();
props.put(AdminClient.CONNECTOR_TYPE, type);
props.put(AdminClient.CONNECTOR_HOST, host);
props.put(AdminClient.CONNECTOR_PORT, port);
try
{
adminclient = AdminClientFactory.createAdminClient(props);
}
catch(Exception ex)
{
new AdminException(ex).printStackTrace();
System.out.println("getAdminClient: exception");
System.exit(1);
}
sniper1990 2007-08-21
然后通过获得的AdminClient对象,查询名为PerfMBean的对象。系统实现了一个名为“PerfMBean”的 MBean 来配置 PMI 服务(也就是设置装备级别),我们可以通过这个MBean来获得PMI数据,而我所想要的线程池数据就是PMI数据的一部分。
取得PerfMBean的代码如下:
StringBuffer oNameQuery=new StringBuffer();
oNameQuery.append(domainName).append(":*");
oNameQuery.append(",type=").append("Perf");
oNameQuery.append(",node=").append("np1");
oNameQuery.append(",process=").append("server1");
try{
Set oSet = ac.queryNames(new ObjectName(oNameQuery.toString()),null);
Iterator i=oSet.iterator();

if(i.hasNext()){
perfon=(ObjectName) i.next();
System.out.println(perfon.toString());

}

正在继续研究学习中,希望大家多多指点。
intolong 2007-08-22
哦,是ITCAM for WAS,呵呵。
sniper1990 2007-08-22
呵呵,因为买不起was nd,所以自己做一些简单的负载均衡方面的开发,请多指教。
sniper1990 2007-08-23
查找线程池对应的Mbean,我找的是servlet对应的线程池bean,名字是Servlet.Engine.Transports。
通过设置查询字符串就可以得到。
ObjectName on = null;
ObjectName re = null;
String queryString = "WebSphere:*,node=" + node + ",process=" + server;
queryString=queryString+",type=ThreadPool,name=Servlet.Engine.Transports";
try{
Set objectNameSet= ac.queryNames(new ObjectName(queryString), null);
Iterator i = objectNameSet.iterator();
String oneType = null;
String oneName = null;
if(i.hasNext()){
on = (ObjectName)i.next();
//System.out.println(on.toString());
oneType=on.getKeyProperty("type");
oneName=on.getKeyProperty("name");
System.out.println("----"+oneType+"----");
System.out.println(on.toString());
re = on;
}
}catch(Exception e){
e.printStackTrace();
}
sniper1990 2007-08-23
on就是我上面取得的Mbean,类型是ObjectName,然后读取它的属性,index是我要取得第几个属性的值,如果是并发线程数,在我的环境里,index=2.

String result="";
Stats st =null;
try{
st =this.collectStatsAttribute(on);
Statistic[] dataMembers = st.getStatistics();
if(dataMembers != null){
for(int i=0; i<dataMembers.length; i++){
if(dataMembers[i] instanceof RangeStatistic){
RangeStatistic data = (RangeStatistic)dataMembers[i];
if(i==index){
result=Long.toString(data.getCurrent());
break;
}
}
}
}
}catch(Exception e){
e.printStackTrace();
}

说的不是很清楚,大家多指教。