Java 如何在 Websphere 中启用 JMX?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/357095/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How do you enable JMX in Websphere?
提问by
I would like to use JConsole to monitor my Websphere application, but I am not sure how to enable JMX.
我想使用 JConsole 来监控我的 Websphere 应用程序,但我不确定如何启用 JMX。
回答by eljenso
Following information is for Websphere 6.1 on Windows.
以下信息适用于 Windows 上的 Websphere 6.1。
First of all, the magic URL to connect to the MBean server is:
首先,连接到 MBean 服务器的神奇 URL 是:
service:jmx:iiop://<host>:<port>/jndi/JMXConnector
If you have a default Websphere installation, the JNDI port number will likely be 2809, 2810, ... depending on how many servers there are installed on one system and the specific one you want to connect to. To be sure, when starting Websphere, check the logs, as it will dump a line like
如果您有默认的 Websphere 安装,JNDI 端口号可能是 2809、2810 ……这取决于在一个系统上安装了多少台服务器以及您想要连接到的特定服务器。可以肯定的是,在启动 Websphere 时,请检查日志,因为它会转储类似
0000000a RMIConnectorC A ADMC0026I: The RMI Connector is available at port 2810
If you don't get this line, open the Websphere admin console and go to
如果您没有看到这一行,请打开 Websphere 管理控制台并转到
Application servers > server1 > Administration Services > JMX connectors
应用程序服务器 > server1 > 管理服务 > JMX 连接器
to see if you need to add or change the config.
查看是否需要添加或更改配置。
Second important bit of information is that the following JAR is always needed when doing JMX with the server:
第二个重要的信息是在使用服务器执行 JMX 时总是需要以下 JAR:
com.ibm.ws.admin.client_6.1.0.jar
You can find this JAR in the the runtimes
directory of Websphere. Whatever you do, whether programmatically accessing MBeans on Websphere, or using JConsole, and so on, use the magic URL and alwaysinclude this JAR.
您可以在runtimes
Websphere的目录中找到这个 JAR 。无论您做什么,无论是通过编程方式访问 Websphere 上的 MBean,还是使用 JConsole 等等,请使用魔术 URL 并始终包含此 JAR。
For the remainder of this answer, assume that Websphere is installed in D:\prog\was61.
对于本答案的其余部分,假设 Websphere 安装在 D:\prog\was61 中。
To run JConsole, type in the following:
要运行 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
Then go to the "Advanced" tab and type in the magic JMX URL. Press connect and you should see the MBeans appear.
然后转到“高级”选项卡并输入神奇的 JMX URL。按连接,您应该会看到 MBean 出现。
Using a Sun JDK is an entirely different matter. You need one extra JAR that is in the lib of the IBM JDK but not Sun's (ibmorb.jar), and maybe the following command may work for you:
使用 Sun JDK 是完全不同的事情。您需要一个额外的 JAR,它位于 IBM JDK 的库中,但不是 Sun 的 (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
I say maybe, because it didn't work for me. I got a nice jndiUnavailCommErr error message, since it expected something on port 2809 while my Websphere installation is listening on 2810, although I correctly specified port 2810 in the JMX URL. But, if you adapt the paths to point to your Sun JDK, it might work for you. It's the closest I ever got to connecting to Websphere using Sun's JDK.
我说可能,因为它对我不起作用。我收到了一条很好的 jndiUnavailCommErr 错误消息,因为当我的 Websphere 安装正在侦听 2810 时,它期望端口 2809 上有一些东西,尽管我在 JMX URL 中正确指定了端口 2810。但是,如果您调整路径以指向您的 Sun JDK,它可能对您有用。这是我最接近使用 Sun 的 JDK 连接到 Websphere 的方法。
Final note: I tried a solution based on RMI, there is also a SOAP connector available but haven't tried it.
最后说明:我尝试了基于 RMI 的解决方案,还有一个可用的 SOAP 连接器,但还没有尝试过。
As always with J2EE, Websphere and stuff: good luck, you'll need it.
与 J2EE、Websphere 和其他东西一样:祝你好运,你会需要它。
回答by eljenso
Look at the following simple method to connect jconsole to Websphere 6.1
看下面jconsole连接Websphere 6.1的简单方法
It does works for me (Solaris, Was 6.1, Sun JVM), it also works with Visual VM
它对我有用(Solaris、Was 6.1、Sun JVM),它也适用于 Visual VM
Enjoy !
享受 !
回答by Tommy
I couldn't get this to work. All I got was
我无法让这个工作。我得到的只是
The connection to username@service:jmx:iiop//localhost:2809/jndi/JMXConnector did not succeed. Would you like to try again?
到 username@service:jmx:iiop//localhost:2809/jndi/JMXConnector 的连接没有成功。你想再试一次吗?
I did however get it working by doing the following:
但是,我确实通过执行以下操作使其正常工作:
- Add "-Djavax.management.builder.initial= -Dcom.sun.management.jmxremote" to the Generic JVM Argument.
- Add these lines to WebSphere/AppServer/java/jre/lib/management/management.properties
- 将“-Djavax.management.builder.initial= -Dcom.sun.management.jmxremote”添加到通用JVM参数中。
- 将这些行添加到 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
But none of the usefull mbeans show up..?
但是没有一个有用的mbeans出现..?
回答by Alan Chan
I found that in order to connect to WAS 6.1 using the Sun JDK JConsole, in addition to the com.ibm.ws.admin.client_6.1.0.jar
JAR file, I had to also include the following 3 JARs on the boot class path when starting JConsole:-
我发现为了使用 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
These can be found in the java\jre\lib directory of websphere.
这些可以在 websphere 的 java\jre\lib 目录中找到。
For example on windows, if you copy all the four JARs listed above to a directory of your choice (i've copied them to C:\packages\was61-jmx in the example below), you can use a batch file like the following to start JConsole:-
例如,在 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%
This worked for me for jdk 1.5 and 1.6 versions of the Sun Jconsole.
这对我来说适用于 Sun Jconsole 的 jdk 1.5 和 1.6 版本。
回答by Bogu?
Maybe it's a little offtopic, but I have found a way to connect to WAS 7.0 JMX server from JConsole. No server setup is required, no AppClient, only some JARs and a little client setup.
也许这有点离题,但我找到了一种从 JConsole 连接到 WAS 7.0 JMX 服务器的方法。不需要服务器设置,不需要 AppClient,只需要一些 JAR 和一些客户端设置。
Use the following script
使用以下脚本
@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%
If the target server has administrative security disabled, comment out CLIENTSAS and PROVIDER lines.
如果目标服务器禁用了管理安全性,请注释掉 CLIENTSAS 和 PROVIDER 行。
If the security is enabled, you will also need sas.client.props file to be put in THIS_DIR directory. The template file can be found under WAS_profile\properties directory. You will have to do a little setup. Here is an excerpt from my sas.client.props
如果启用了安全性,您还需要将 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
OK :)
好的 :)
After connecting, the login popup will appear. Type your admin user and password (user & pw are not required on the connection dialog in JConsole)
连接后,将出现登录弹出窗口。输入您的管理员用户和密码(JConsole 中的连接对话框中不需要用户和密码)
You may run the JConsole from IBM JDK, or Sun JDK. For IBM, no other setup is required. However, for Sun you may need to put orb.properties file in your home directory. The file can be found in com.ibm.ws.ejb.thinclient_7.0.0.jar.
您可以从 IBM JDK 或 Sun JDK 运行 JConsole。对于 IBM,不需要其他设置。但是,对于 Sun,您可能需要将 orb.properties 文件放在您的主目录中。该文件可以在 com.ibm.ws.ejb.thinclient_7.0.0.jar 中找到。
回答by tjg184
You can find the correct port to connect to on the WebSphere Application Server under Communications -> Ports. The port associated with BOOTSTRAP_ADDRESS allows you to connect.
您可以在 WebSphere Application Server 上的 Communications -> Ports 下找到要连接到的正确端口。与 BOOTSTRAP_ADDRESS 关联的端口允许您进行连接。
回答by Robert H?glund
It is simple. Just start Websphere with the following JMX parameters:
很简单。只需使用以下 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
Then start JConsole or VisualVM and connect to localhost:1099
然后启动 JConsole 或 VisualVM 并连接到 localhost:1099
Since i am not allowed to post a proof screenshot i post the information from the visualvm "overview tab".
由于我不允许发布证明屏幕截图,因此我发布了来自visualvm“概览选项卡”的信息。
PID: 12568 Host: localhost Main class: <unknown> Arguments: <none> JVM: IBM J9 VM (2.3, J2RE 1.5.0 IBM J9 2.3 Windows XP x86-32 j9vmwi3223-20100808 (JIT enabled) J9VM - 20100629_60535_lHdSMr JIT - 20100623_16197_r8 GC - 20100211_AA) Java: version 1.5.0, vendor IBM Corporation Java Home: C:\Program Files\IBM\SDP\runtimes\base_v61\java\jre JVM Flags: <none> Heap dump on OOME: disabled
回答by Max
You cannot set the required system properties through the WAS console, because it does not allow you specify empty values. Instead, you have to insert the following at the bottom of 'server.xml':
您不能通过 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"/>
回答by Eddy
you can try the following, it uses the SOAP protocol adapter. I think it's as lean a configuration possible.
您可以尝试以下方法,它使用 SOAP 协议适配器。我认为这是尽可能精简的配置。
#!/bin/sh
current_dir=`dirname "#!/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
"`
HOSTNAME=host.fqdn
PORT=2809
WAS_HOME=/opt/IBM/WebSphere/AppServer
WAS_PROFILE=$WAS_HOME/profiles/AppSrv01
WAS_RUNTIMES=$WAS_HOME/runtimes
WAS_LIB=$WAS_HOME/java/lib
JAVA_HOME=$WAS_HOME/java
CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/jconsole.jar:$WAS_RUNTIMES/com.ibm.ws.admin.client_7.0.0.jar:$WAS_LIB/ibmcfw.jar
TARGET=service:jmx:soap://$HOSTNAME:$PORT/jndi/JMXConnector
CP="-J-Djava.class.path=$CLASSPATH"
SSL_SERVER_KEY="-J-Djavax.net.ssl.keyStore=$WAS_PROFILE/etc/DummyServerKeyFile.jks -J-Djavax.net.ssl.keyStorePassword=WebAS"
SSL_TRUST_STORE="-J-Djavax.net.ssl.trustStore=$WAS_PROFILE/etc/DummyServerTrustFile.jks -J-Djavax.net.ssl.trustStorePassword=WebAS"
SSL_OPTS="-J-Dcom.ibm.SSL.ConfigURL=file:$WAS_PROFILE/properties/ssl.client.props"
SOAP_OPTS="-J-Dcom.ibm.SOAP.ConfigURL=file:$WAS_PROFILE/properties/soap.client.props"
WAS_OPTS="-J-Dwas.install.root=$WAS_HOME -J-Djava.ext.dirs=$WAS_HOME/plugins:$WAS_HOME/lib:$WAS_HOME/plugins/com.ibm.ws.security.crypto_6.1.0:$WAS_HOME/lib:$JAVA_HOME/jre/lib/ext"
COMMAND="$JAVA_HOME/bin/jconsole $CP $SSL_SERVER_KEY $SSL_TRUST_STORE $SSL_OPTS $SOAP_OPTS $WAS_OPTS $TARGET"
exec $COMMAND
Credits to my colleague Jeroen for the initial version of the script using IIOP (I'm trying SOAP in the hope that it will work with Hyperic)
感谢我的同事 Jeroen 使用 IIOP 编写脚本的初始版本(我正在尝试使用 SOAP,希望它能与 Hyperic 一起使用)
回答by Drago Z Kamenov
I also struggled for a few hours to get this to work and I found the solution. The key issue is here is SSL - the client has to use the proper keys to establish a SSL connection to the server. This involves pointing to the correct trust store location and trust store password as described here. The best way to set up the environment is to call the setupCmdLine.sh (on Windoze it is setupCmdLine.bat) for the relevant server, and then invoke jconsole like this:
我也努力了几个小时才能让它工作,我找到了解决方案。这里的关键问题是 SSL - 客户端必须使用正确的密钥来建立与服务器的 SSL 连接。这包括指向正确的信任存储位置和信任存储密码的描述在这里。设置环境的最好方法是调用相关服务器的 setupCmdLine.sh(在 Windoze 上是 setupCmdLine.bat),然后像这样调用 jconsole:
##代码##