前一阶段一直做WebSphere6.1服务器监控研究,网上的资料不多,也不全,自己翻译加领悟,终于实现了全部的功能,下来就分享一下我的成果。
1问题的突破点PerfServletApp.ear
我在WebSphere根目录AppServer\installableApps里找到了这个程序,部署到WebSphere服务器上,发现它可以获得服务器的所有监控数据。这对我来说很有用,因为我还不知道WebSphere有哪些组件有哪些指标可以监控。我用jd-gui这个java反编译工具将这个程序反编译过来,修改了反编译产生的错误,并添加了所需的jar包,它就可以部署到我的tomcat并监控WebSphere了。
使用Search and Replace工具(它可以搜索jar)在WebSphere安装目录下找到了所需的jar包com.ibm.ws.admin.client_6.1.0.jar、com.ibm.ws.security.crypto_6.1.0.jar、ibmpkcs.jar、ws_runtime.jar、servlet-api.jar。要注意com.ibm.ws.admin.client_6.1.0.jar和ws_runtime.jar两个jar包中都有javax.servlet的东西,这和tomcat的common\lib中的servlet-api.jar是冲突的,必须用winrar打开这两个jar包,手工删除掉javax文件夹,否则这两个jar包加载不了!
这几个jar包是必须的(找了好久!最后还是通过在程序中添加System.setProperty("javax.net.debug", "ssl");这句话才调试出了错误原因),因为正常情况下WebSphere服务器安装的时候都添加了安全性,也就是说登录console端是需要输入密码的。所以我们使用JMX连接WebSphere的时候就要接受WebSphere的认证。
2使用SSL soap连接方式
为了搞懂这种连接方式如何运作,花费了我很大的工作量。最终在某贴吧上找到了篇神贴,成功导入了证书(参考附件《websphere6.1证书导入.rar》)。然后就是修改PerfServletApp的AdminClient的获取方法了,因为它使用的是AdminServiceFactory.getAdminService()直接从服务器上获得客户端的办法,而我的目标是在我的tomcat上部署,此方法显然不行。下面贴出我的完整连接方法:
public static AdminClient createConncetion() {
// System.setProperty("javax.net.debug", "ssl");
// Security.setProperty("ssl.SocketFactory.provider", "com.ibm.jsse2.SSLSocketFactoryImpl");
// Security.setProperty("ssl.ServerSocketFactory.provider", "com.ibm.jsse2.SSLServerSocketFactoryImpl");
AdminClient adminClient = null;
Properties connectProps = new Properties();
connectProps.setProperty(AdminClient.CONNECTOR_TYPE,
AdminClient.CONNECTOR_TYPE_SOAP);
connectProps.setProperty(AdminClient.CONNECTOR_HOST, "192.168.1.152");
connectProps.setProperty(AdminClient.CONNECTOR_PORT, "8880");
connectProps.setProperty(AdminClient.USERNAME, "admin");
connectProps.setProperty(AdminClient.PASSWORD, "pwd");
connectProps
.setProperty(AdminClient.CONNECTOR_SECURITY_ENABLED, "true");
connectProps.setProperty("javax.net.ssl.trustStore",
"c:/test/trust.jks");
connectProps.setProperty("javax.net.ssl.keyStore", "c:/test/store.jks");
connectProps.setProperty("javax.net.ssl.trustStorePassword", "trust");
connectProps.setProperty("javax.net.ssl.keyStorePassword", "key");
try {
adminClient = AdminClientFactory.createAdminClient(connectProps);
} catch (ConnectorException e) {
e.printStackTrace();
}
return adminClient;
}