在WebSphere中如何启用JMX?

30

我想要使用 JConsole 监控我的 WebSphere 应用程序,但我不确定如何启用 JMX。

12个回答

33

以下信息适用于Windows上的Websphere 6.1。

首先,连接到MBean服务器的魔法URL为:

service:jmx:iiop://<host>:<port>/jndi/JMXConnector
如果你使用了默认的Websphere安装,JNDI端口号很可能是2809,2810等,这取决于在一个系统上安装了多少个服务器以及你想要连接哪个特定的服务器。为了确保,请在启动Websphere时检查日志,因为它会输出类似以下的行:
0000000a RMIConnectorC A   ADMC0026I: The RMI Connector is available at port 2810
如果您不理解这行内容,请打开Websphere管理控制台并转到Application servers > server1 > Administration Services > JMX connectors,查看是否需要添加或更改配置。另一个重要的信息是,与服务器进行JMX时始终需要以下JAR文件:
com.ibm.ws.admin.client_6.1.0.jar
你可以在Websphere的目录中找到这个JAR文件。无论你是通过编程访问Websphere上的MBeans,还是使用JConsole等工具,都要使用magic URL,并始终包含这个JAR文件。
接下来的内容中,默认Websphere安装在D:\prog\was61目录下。
要运行JConsole,请键入以下内容:
D:\prog\was61\java\bin>jconsole -J-Djava.class.path=d:\prog\was61\java\lib\tools.jar;D:\prog\was61\runtimes\com.ibm.ws.admin.client_6.1.0.jar

然后转到“高级”选项卡,输入神奇的JMX URL。点击连接,然后您应该看到出现MBeans。

使用Sun JDK则完全不同。您需要一个额外的JAR文件,位于IBM JDK的lib中但不在Sun的lib中(ibmorb.jar),也许以下命令适用于您:

C:\Program Files\Java\jdk1.5.0_11\bin>jconsole -J-Djava.class.path="c:\Program Files\Java\jdk1.5.0_11\lib\jconsole.jar";"c:\Program Files\Java\jdk1.5.0_11\lib\tools.jar";D:\prog\was61\runtimes\com.ibm.ws.admin.client_6.1.0.jar;D:\prog\was61\java\jre\lib\ibmorb.jar

我说"可能可以", 因为对我来说它没有起作用。我收到了一个很好的jndiUnavailCommErr错误消息,因为它期望在端口2809上得到一些回应,而我的Websphere安装正在监听2810端口,尽管我在JMX URL中正确指定了端口2810。但是,如果您调整路径以指向您的Sun JDK,则可能适用于您。这是我使用Sun的JDK最接近连接到Websphere的方式。

最后注意:我尝试过基于RMI的解决方案,还有一个可用的SOAP连接器,但我没有尝试过。

总之,像往常一样,与J2EE、Websphere和其他东西一起使用时,祝你好运,你会需要的。


1
+1 非常有效。很抱歉你可能经历了痛苦 :) - Andre Steingress
+1 给你“祝你好运,你会需要它的”……顺便说一句,我有这个对象的树形结构,但由于 ADMN0022E(缺少权限或类似的原因),我无法查看属性。有什么想法吗? - poussma
1
你可能需要将 jconsole.jar 添加到类路径中,同时也要添加 IBM jconsole。 - Flavio
“魔法URL” service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi 对我起了作用。 - Joost
我做了所有的事情,但还是不起作用。我得到了MBeans选项卡,但没有内存。 - Berlin Brown

9

很简单。只需使用以下JMX参数启动Websphere:

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

然后启动JConsole或VisualVM并连接到localhost:1099

由于我不被允许发布证明截图,因此我会在visualvm的“概述”选项卡中发布信息。

进程ID:12568
主机:localhost
主类:<unknown>
参数:<none>
JVM:IBM J9 VM(2.3,J2RE 1.5.0 IBM J9 2.3 Windows XP x86-32 j9vmwi3223-20100808(启用JIT)
J9VM - 20100629_60535_lHdSMr
JIT - 20100623_16197_r8
GC - 20100211_AA)
Java:版本1.5.0,供应商IBM Corporation
Java主目录:C:\Program Files\IBM\SDP\runtimes\base_v61\java\jre
JVM标志:<none>
内存转储开关:禁用

这对我有点用,我不得不在WebSphere控制台下的Servers/Application servers/server1/Java y gestión de procesos/Definición de proceso/Máquina virtual Java/Argumentos de JVM genéricos中添加相同的参数(抱歉,这是西班牙语,我也更喜欢英文版,但IBM的某个人一定认为我们以西班牙语为母语的人会更喜欢可怕的翻译)。希望这能帮助到某些人。 - jambriz
实际上,这并不起作用。我尝试通过将这些参数添加到startServer.sh文件的D_ARGS选项中来实现。然后,在1099上连接,它只显示WebSphere管理进程的数据,并未显示包含应用程序进程的信息。 - djangofan
有道理,因为WebSphere运行在IBM JDK上,所以com.sun.*包不存在,对吧? - djangofan
对我有用...请注意,在 -Djavax.management.builder.initial= 之后添加一个空格。 - Samih A

6
也许有些离题,但我找到了一种从JConsole连接到WAS 7.0 JMX服务器的方法。无需设置服务器,无需AppClient,只需要一些JAR文件和少量客户端设置。
使用以下脚本:
@echo off 
set HOST=<host>
set PORT=2809

set WAS_HOME=D:/Programy/IBM/WebSphere/AppServer

set THIS_DIR=E:/Home/Bogus/Pulpit

set CLIENTSAS=-Dcom.ibm.CORBA.ConfigURL=file:/%THIS_DIR%/sas.client.props
set PROVIDER=-Djava.naming.provider.url=corbaname:iiop:%HOST%:%PORT% 

set PROPS=
set PROPS=%PROPS% %CLIENTSAS%
set PROPS=%PROPS% %PROVIDER%

set CLASSPATH=
set CLASSPATH=%CLASSPATH%;%WAS_HOME%\java\lib\tools.jar
set CLASSPATH=%CLASSPATH%;%WAS_HOME%\runtimes\com.ibm.ws.admin.client_7.0.0.jar
set CLASSPATH=%CLASSPATH%;%WAS_HOME%\runtimes\com.ibm.ws.ejb.thinclient_7.0.0.jar
set CLASSPATH=%CLASSPATH%;%WAS_HOME%\runtimes\com.ibm.ws.orb_7.0.0.jar
set CLASSPATH=%CLASSPATH%;%WAS_HOME%\java\lib\jconsole.jar

set URL=service:jmx:iiop://%HOST%:%PORT%/jndi/JMXConnector

@echo on

:: %WAS_HOME%\java\bin\
java -classpath %CLASSPATH% %PROPS% sun.tools.jconsole.JConsole %URL%

如果目标服务器的管理安全已禁用,请注释掉CLIENTSAS和PROVIDER行。
如果启用了安全性,您还需要将sas.client.props文件放置在THIS_DIR目录中。模板文件可以在WAS_profile\properties目录下找到。您需要进行一些设置。以下是我的sas.client.props的摘录。
com.ibm.CORBA.securityEnabled=true

com.ibm.CORBA.authenticationTarget=BasicAuth
com.ibm.CORBA.authenticationRetryEnabled=true
com.ibm.CORBA.authenticationRetryCount=3
com.ibm.CORBA.validateBasicAuth=true
com.ibm.CORBA.securityServerHost=
com.ibm.CORBA.securityServerPort=
com.ibm.CORBA.loginTimeout=300
com.ibm.CORBA.loginSource=prompt

com.ibm.CORBA.loginUserid=
com.ibm.CORBA.loginPassword=

com.ibm.CORBA.krb5ConfigFile=
com.ibm.CORBA.krb5CcacheFile=

com.ibm.CSI.performStateful=true

com.ibm.CSI.performClientAuthenticationRequired=false
com.ibm.CSI.performClientAuthenticationSupported=true

# SET ALL THE FOLLOWING VALUES TO FALSE

com.ibm.CSI.performTLClientAuthenticationRequired=false
com.ibm.CSI.performTLClientAuthenticationSupported=false

com.ibm.CSI.performTransportAssocSSLTLSRequired=false
com.ibm.CSI.performTransportAssocSSLTLSSupported=false

com.ibm.CSI.performMessageIntegrityRequired=false
com.ibm.CSI.performMessageIntegritySupported=false

com.ibm.CSI.performMessageConfidentialityRequired=false
com.ibm.CSI.performMessageConfidentialitySupported=false

# COMMENT THIS OUT
#com.ibm.ssl.alias=DefaultSSLSettings


com.ibm.CORBA.requestTimeout=180

连接成功后,将出现登录弹窗。输入您的管理员用户名和密码(在JConsole的连接对话框中不需要输入用户名和密码)。

您可以从IBM JDK或Sun JDK运行JConsole。对于IBM,不需要进行其他设置。但是,对于Sun,您可能需要在主目录中放置orb.properties文件。该文件可以在com.ibm.ws.ejb.thinclient_7.0.0.jar中找到。


5
我无法让它工作。我只得到了以下信息:
连接 username@service:jmx:iiop//localhost:2809/jndi/JMXConnector 失败。您想再试一次吗?
然而,我通过以下步骤使其工作:
1. 将“-Djavax.management.builder.initial= -Dcom.sun.management.jmxremote”添加到通用JVM参数中。 2. 将以下行添加到WebSphere/AppServer/java/jre/lib/management/management.properties文件中:
com.sun.management.jmxremote.port=9999 com.sun.management.jmxremote.authenticate=false com.sun.management.jmxremote.ssl=false 但是,没有任何有用的MBeans出现了...?

@Tommy - 你有没有想过以某种方式来获取那些“有趣”的东西?我的意思是不需要整个额外的Jars/IIOP复杂操作。 - Chris
@Chris 不,我从来没有按照我想要的方式使它工作。最终使用了WAS附带的PMI servlet,然后解析xml并使用Munin进行图形化。效果很好。 - Tommy

4

我发现,要使用Sun JDK JConsole连接到WAS 6.1,除了com.ibm.ws.admin.client_6.1.0.jar JAR文件外,在启动JConsole时还必须将以下3个JAR文件包含在引导类路径中:

ibmorbapi.jar
ibmorb.jar
ibmcfw.jar

这些文件可以在WebSphere的java\jre\lib目录中找到。

例如,在Windows上,如果你将上述四个JAR文件复制到你指定的目录中(在下面的示例中,我已将它们复制到C:\packages\was61-jmx),你可以使用以下批处理文件启动JConsole:

set JAVA_HOME=C:\Progra~1\Java\jdk1.5.0_20
set WAS6.1_JARS=C:\packages\was61-jmx

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

set CLASSPATH=%WAS6.1_JARS%\com.ibm.ws.admin.client_6.1.0.jar
set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\lib\tools.jar
set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\lib\jconsole.jar


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

这个对于Sun Jconsole 1.5和1.6版本的jdk对我有用。


3
我也曾经为此苦苦挣扎数小时,最终找到了解决方法。关键问题在于SSL——客户端必须使用正确的密钥以建立与服务器的SSL连接。这涉及指向正确的信任库位置和信任库密码,如这里所述。设置环境的最佳方式是为相关服务器调用setupCmdLine.sh(在Windows上是setupCmdLine.bat),然后像这样调用jconsole:
#!/bin/bash

WAS_HOME=/opt/IBM/WebSphere/AppServer

# setup server-specific env variables
. $WAS_HOME/profiles/AppSrv01/bin/setupCmdLine.sh

HOST=localhost
PORT=9100

CLASSPATH=$JAVA_HOME/lib/jconsole.jar
CLASSPATH=$CLASSPATH:$WAS_HOME/runtimes/com.ibm.ws.admin.client_8.5.0.jar
CLASSPATH=$CLASSPATH:$WAS_HOME/runtimes/com.ibm.ws.ejb.thinclient_8.5.0.jar
CLASSPATH=$CLASSPATH:$WAS_HOME/runtimes/com.ibm.ws.orb_8.5.0.jar

$JAVA_HOME/bin/jconsole \
    -J-Djava.class.path=$CLASSPATH\
    -J$CLIENTSAS\
    -J$CLIENTSSL\
    service:jmx:iiop://$HOST:$PORT/jndi/JMXConnector

2

来自http://malliktalksjava.in/2010/07/26/enable-jmx-remote-port-in-websphere/

在WebSphere中启用JMX远程端口的步骤:

  1. 打开WebSphere应用服务器控制台。
  2. 选择“服务器”选项卡,然后选择您要配置的服务器。
  3. 在“通信”下拉菜单中,选择“端口”。
  4. 单击“新建”按钮以创建一个新的端口。
  5. 在“端口类型”部分中,选择“JMXConnector”。
  6. 在“端口值”字段中,指定要使用的端口号。
  7. 保存更改并重新启动WebSphere服务器。
  1. Login to Admin console of the web sphere any profile(server), short cut will be available in start menu programs.

    • Deploy the PerfServletApp.ear application if not deployed already.
    • Check if PerfServletApp.ear is deployed:
      • Exapnd Applications +> Application Types +> WebSphere Enterpise Applications
      • If not, click New Application.
    • Browse from WebSphere directory -> AppServer -> InstallableApps.
    • (FOLLOW THE STEPS.)
  2. Enable the PMI Data and set all the statistics enabled.

    • In left pane (bottom), go to Monitoring and Tuning +> Performance Monitoring Infrastructure(PMI)
    • In Configuration tab, enable the PMI.
    • In this Configuration tab, and the Runtime tab, set All statistics. Then Save changes.
  3. Set JVM argument

    • In Severs +> Server Types +> WebSphere Application Servers, then -> [server-name] +> Process definition -> Java Virtual Machine
    • Set the generic jvm argument to include

      -Djavax.management.builder.initial= -Dcom.sun.management.jmxremote

    in shows the servers list. click on the server you want.

    • In the right pane -> Server Infrastructure -> Java and Process Management click on Process definition, again in Additional Properties of Configuration tab click on Java Virtual Machine. put the -Djavax.management.builder.initial= -Dcom.sun.management.jmxremote in Generic Jvm Argument field and save changes.
  4. To enable the JMX remote port open the following properties file and add the code that follows. In [WebSphere-directory]\AppServer\java\jre\lib\management\management.properties, add:

    com.sun.management.jmxremote.port=9001
    com.sun.management.jmxremote.ssl=false
    com.sun.management.jmxremote.authenticate=false
    
  5. Save the master data, stop the server, and start the server to load the changes.


2

您无法通过WAS控制台设置所需的系统属性,因为它不允许您指定空值。相反,您需要在'server.xml'底部插入以下内容:

<systemProperties xmi:id="Property_1315391623828" name="com.sun.management.jmxremote" value="" required="false"/>    <systemProperties xmi:id="Property_1315327918140" name="com.sun.management.jmxremote.port" value="1235" required="false"/>
<systemProperties xmi:id="Property_1315327935281" name="com.sun.management.jmxremote.authenticate" value="false" required="false"/>
<systemProperties xmi:id="Property_1315327948046" name="com.sun.management.jmxremote.ssl" value="false" required="false"/>
<systemProperties xmi:id="Property_1315390852859" name="javax.management.builder.initial" value="" required="false"/>

1

您可以在WebSphere应用服务器的通信 -> 端口下找到正确的端口。与BOOTSTRAP_ADDRESS相关联的端口允许您进行连接。


1

您是否仍然可以使用此解决方案访问WebSphere JMX bean,以获取有关Servlet和连接池的信息? - eljenso
链接在这里,方法可行:http://www.ecovations.de/blog/?p=99。但是无法从远程jconsole连接,不确定原因。仅限本地控制台。 - djangofan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接