公司项目上需要写一个监控websphere的插件,马上开始找资料,半天下来还是看的迷迷糊糊的,我X,IBM的东西真TM的难弄,哎,难弄归难弄,还是需要做下去的,网上的资料大部分都是时间比较长的,下面自己写一个自己在这一过程中碰到的问题。

  首先,下载搭建websphere的实际环境,这里就不一一写了,非常简单,在网上一搜一大堆,安装完之后,我们先远程用jconsole连接websphere,websphere里面需要的配置如下:

   服务器——》应用服务器——》server1——》java和进程管理——》进程定义——》java虚拟机,通用JVM参数里面填入:


 
  
  1. -Djavax.management.builder.initial= -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=1099

中间不要有空格。

还有初始的堆栈需要设置下,大家根据自己的情况自己设置。


然后需要设置JDK的环境,默认的JDK是不带IBM连接包的,只有到安装了websphere上的机器上copy下来,

这里网上有个bat文件,大家可以按文件里的内容copy包的内容。用搜索功能来找到websphere机器上的这几个包。


 
  
  1. set JAVA_HOME="D:\jdk1.6"

  2. set WAS6.1_JARS="C:\Documents and Settings\Administrator\桌面\lib"

  3. set BOOTJARS=%WAS6.1_JARS%\ibmorbapi.jar

  4. set BOOTJARS=%BOOTJARS%;%WAS6.1_JARS%\ibmorb.jar

  5. set BOOTJARS=%BOOTJARS%;%WAS6.1_JARS%\ibmcfw.jar

  6. set CLASSPATH=%WAS6.1_JARS%\com.ibm.ws.admin.client_6.1.0.jar

  7. set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\lib\tools.jar

  8. set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\lib\jconsole.jar

  9. %JAVA_HOME%\bin\jconsole -J-Xbootclasspath/p:%BOOTJARS% -J-Djava.class.path=%CLASSPATH%

大家把它复制到bat文件里,根据情况修改里面这个代码里的内容(其实也没什么就是一些路径)。大家也可以先把ws_runtime.jar这个包copy下来,呆会要用到。


最后就可以用jconsole来连接websphere了。


 
  
  1. service:jmx:iiop://your host ip:port/jndi/JMXConnector


OK,连接成功。


如果你不想用IBM的包连接,用sun自带的包连接的URL为:



service:jmx:iiop://<host>/jndi/corbaname:iiop:<host>:<port>/WsnAdminNameService#JMXConnector



下面我们需要用程序连接到websphere,IBM提供给了我们接口和方法,这里有二点,第一点没有开启SOAP安全机制的,这种就好办多了,

直接把com.ibm.ws.admin.client_6.1.0.jar这个包加到工程里面。



 
  
  1. AdminClinet ac = null;

  2. java.util.Properties props = new java.util.Properties();

  3. props.setProperty(AdminClient.CONNECTOR_TYPE,AdminClient.CONNECTOR_TYPE_SOAP);  

  4. props.setProperty(AdminClient.CONNECTOR_HOST,IpAddr);  

  5. props.setProperty(AdminClient.CONNECTOR_PORT,Port);  

  6. ac = AdminClient.createAdminClient(props);

  7. ObjectName objName = new ObjectName("WebSphere:name=JVM,process=server1,platform=proxy,node=WWWF6897B0C501Node02,j2eeType=JVM,J2EEServer=server1,version=6.1.0.3,type=JVM,mbeanIdentifier=JVM,cell=WWW-F6897B0C501Node02Cell,spec=1.0");

  8. ac.getAttribute(objName,"freeMemory");

这样就可以取到数了,非常的简单,但前提是需要把 安全性——启用管理安全性的选项给关掉,很明显,企业方面是不可能把这个项安全认证关掉的。


如果上面的程序直接运行在启用安全机制的机器上会出现如下错误:


 
  
  1. com.ibm.websphere.management.exception.ConnectorException: ADMC0053E: 启用 SOAP 连接器安全性时,系统无法创建连接到端口 8880 上的主机 192.168.133.195 的 SOAP 连接器。

  2. at com.ibm.websphere.management.AdminClientFactory.createAdminClient(AdminClientFactory.java:476)

  3. at check_websphere.CreateConnect(check_websphere.java:90)

  4. at check_websphere.main(check_websphere.java:27)


下面就来说启用安全认证后,我们的程序如何连接到远程websphere,

首先,需要制作和导入安全证书,这里我不就写了,网上有非常多的教程,还是贴个地址出来,大家按照这样做就行了。

http://hi.baidu.com/lff0305/item/10e2664262a3a4f5dd0f6c64


这里到后面制作完成之后,激活SSL证书我也不知道他这样做能不能连接上,我是后来又参考了另外一个证书导入的方法,

http://verisign.itrus.com.cn/html/fuwuyuzhichi/fuwuqizhengshuanzhuangpeizhizhinan/414.html


这样应该就可以了,然后在程序中添加如下代码:


 
  
  1. adminProps.setProperty(AdminClient.USERNAME, "jbns");

  2. adminProps.setProperty(AdminClient.PASSWORD, "jbns");

  3. adminProps.setProperty(AdminClient.CONNECTOR_SECURITY_ENABLED, "true");

  4. adminProps.setProperty("javax.net.ssl.trustStore", "c:/test/trust.jks");

  5. adminProps.setProperty("javax.net.ssl.keyStore", "c:/test/store.jks");

  6. adminProps.setProperty("javax.net.ssl.trustStorePassword", "jbns");

  7. adminProps.setProperty("javax.net.ssl.keyStorePassword", "jbns");    

OK,这样就可以运行上面的程序了。

如果运行还有错误,错误为:


 
  
  1. setting up default SSLSocketFactory

  2. SSLSocketFactory instantiation failed: java.lang.ClassNotFoundException: com.ibm.websphere.ssl.protocol.SSLSocketFactory

这是因为jre的包里面没有

com.ibm.websphere.ssl.protocol.SSLSocketFactory   这个类。

这就要用到上面已经复制好了的那个包了,ws_runtime.jar。把它也加到工程中来。

在加上


 
  
  1. Security.setProperty("ssl.SocketFactory.provider", "com.ibm.jsse2.SSLSocketFactoryImpl");

  2. Security.setProperty("ssl.ServerSocketFactory.provider", "com.ibm.jsse2.SSLServerSocketFactoryImpl");

这二句,

我感觉加不加好像一样勒,把那个包加进来之后就可以取数了,但是这个包里面木有这个类呐,其它好童鞋知道了顺便说下,我就不去追踪拉,嘿嘿。


到这里程序远程获取websphere性能数据环境就OK拉,剩下的就是大家畅心的编出自己想拿到数据的代码了。

顺便贴个websphere可以获取的性能数据:

http://pic.dhe.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.javadoc.doc/public_html/mbeandocs/index.html