blob: 25c5ef0c36f3fa9e364f59eb53e8c8394f7cea64 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--
Copyright (c) 2009, 2010, 2011, Oracle and/or its affiliates. All rights reserved.
-->
<html>
<head>
<title>开发 Java 管理扩展 (JMX) 管理器并连接到远程 JMX 代理</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" >
<meta name="description" content="Remote manager tutorial for NetBeans JMX Wizard module">
<link rel="stylesheet" href="../../../netbeans.css">
<meta name="TOPIC" content="ADVANCED">
<meta name="TYPE" content="ARTICLE">
<meta name="AUDIENCE" content="NBUSER">
<meta name="author" content="Jean-Francois DENISE">
<meta name="author" content="Joel FERAUD">
<meta name="KEYWORDS" content="NETBEANS, TUTORIAL, GUIDE, USER, DOCUMENTATION, JMX">
<meta name="description" content="A tutorial on how to implement and use a JMX manager and JMX agent in NetBeans IDE"/>
<link rel="stylesheet" type="text/css" href="../../../lytebox.css" media="screen">
<script type="text/javascript" src="../../../images_www/js/lytebox-compressed.js"></script>
</head>
<body>
<h1>开发 Java 管理扩展 (JMX) 管理器并连接到远程 JMX 代理</h1>
<p class="align-center"><b>预计时间:30 分钟</b></p>
<p>NetBeans JMX 向导模块将 JMX 技术集成到 NetBeans IDE 中的工作流。此模块允许您快速开发管理应用程序,向现有应用程序添加管理,开发管理器应用程序,以及监视虚拟机的状态。
</p>
<p>本教程将向您演示如何执行以下操作:</p>
<ol>
<li>启动 JMX 代理以使其可从远程 JMX 管理器进行访问。</li>
<li>创建 JMX 管理器。</li>
<li>运行该管理器。</li>
<li>更新该管理器以添加您自己的管理逻辑。 </li>
</ol>
<h3>教程练习</h3>
<img alt="此页上的内容适用于 NetBeans IDE 7.2、7.3、7.4 和 8.0" class="stamp" src="../../../images_www/articles/73/netbeans-stamp-80-74-73.png" title="此页上的内容适用于 NetBeans IDE 7.2、7.3、7.4 和 8.0">
<ul>
<li><a href="#Exercise_1">创建管理样例 Anagram 项目</a></li>
<li><a href="#Exercise_2">运行代理</a></li>
<li><a href="#Exercise_3">创建管理器项目</a>
<ul>
<li><a href="#Exercise_3">创建项目</a></li>
<li><a href="#Exercise_4">创建可运行的管理器类</a></li>
</ul>
</li>
<li><a href="#Exercise_5">运行管理器</a></li>
</ul>
<h3>先决条件</h3>
<p>本教程假定您具备以下技术的一些基本知识或编程经验。 </p>
<ul>
<li>JMX 技术:<a href="http://download.oracle.com/javase/6/docs/technotes/guides/jmx/index.html">JMX 联机文档</a>
</li>
<li>Java 技术:<a href="http://www.oracle.com/technetwork/java/javase/tech/index.html">Java SE 技术概览</a>
</li>
<li>NetBeans IDE</li>
</ul>
<p>您还将受益于在 <a href="http://download.oracle.com/javase/6/docs/technotes/guides/management/index.html">Java 平台的监视和管理</a>方面的一些知识</p>
<h3>本教程所需要的软件</h3>
<p>在学习本教程之前,您需要在计算机上安装以下软件:</p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">软件或资源</th>
<th class="tblheader" scope="col">要求的版本</th>
</tr>
<tr>
<td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">NetBeans IDE</a></td>
<td class="tbltd1">7.2、7.3、7.4、8.0、Java 版本</td>
</tr>
<tr>
<td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Java 开发工具包 (JDK)</a></td>
<td class="tbltd1">版本 7 或 8</td>
</tr>
<tr>
<td class="tbltd1">JMX 插件</td>
<td class="tbltd1">可从 NetBeans 更新中心获得</td>
</tr>
<tr>
<td class="tbltd1">JConsole 插件</td>
<td class="tbltd1">可从 NetBeans 更新中心获得</td>
</tr>
</tbody>
</table>
<p>要安装 <strong>JMX</strong><strong>JConsole</strong> 插件,请选择“工具”>“插件”,然后从 NetBeans 更新中心下载模块。</p>
<h3>资源</h3>
<ul>
<li>NetBeans 帮助目录(“帮助”>“帮助目录”> "JMX")。也可从向导中获得此帮助。</li>
</ul>
<a name="Exercise_1"></a>
<h2>创建管理样例 Anagram 项目</h2>
<p>本练习的目标是创建一个管理器应用程序可连接到的 JMX 代理。JMX 插件包括 JMX 代理样例 Java 项目。在此练习中,您将创建此样例项目,而不是从头开始编写 JMX 代理。
</p>
<ol>
<li>选择 "File"(文件)> "New Project"(新建项目)。</li>
<li>在 "Samples"(样例)中,选择 "JMX" 类别。</li>
<li>选择 "Anagram Game Managed with JMX"(使用 JMX 管理的 Anagram Game)项目。<br /> <img alt="&amp;quot;New Project&amp;quot;(新建项目)向导中的 &amp;quot;Anagram Game Managed with JMX&amp;quot;(使用 JMX 管理的 Anagram Game)项目的屏幕快照" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-newproject.png" title="&amp;quot;New Project&amp;quot;(新建项目)向导中的 &amp;quot;Anagram Game Managed with JMX&amp;quot;(使用 JMX 管理的 Anagram Game)" /></li>
<li>单击 "Next"(下一步)。无需更改已有的默认项目名称和位置值。确认选中 "Set as Main Project"(设置为主项目),然后单击 "Finish"(完成)。</li>
</ol>
<a name="Exercise_2"></a>
<h2>运行代理</h2>
<p>本练习的目标是启动一个启用了 JMX 远程管理的 Java 应用程序。远程管理允许客户端应用程序(JMX 管理器)连接到应用程序(JMX 代理)并可视化管理和监视信息。</p>
<p class="notes"><strong>注:</strong>基于 JDK 1.5、JDK 1.6 或 JDK 1.7 运行的任何应用程序均是您可为其启用远程管理的 JMX 代理。</p>
<ol>
<li>确认 JMXAnagramGame 项目处于选中状态且设置为主项目。 </li>
<li>右键单击 "JMXAnagramGame" 项目,然后选择 "Properties"(属性)。</li>
<li>在项目的 "Properties"(属性)对话框中选择 <strong>Monitoring and Management</strong>(监视和管理)类别。</li>
<li>取消选择 <strong>Attach JConsole to Project</strong>(将 JConsole 附加到项目)。</li>
<li>选择 <strong>Enable RMI Remote Access</strong>(启用 RMI 远程访问)。单击 "OK"(确定)。<br> <img alt="配置代理" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-properties1.png" title="项目 &amp;quot;Properties&amp;quot;(属性)对话框中的 &amp;quot;Monitoring and Management&amp;quot;(监视和管理)类别">
<p>可以提供代理用于等待传入的 JMX 请求的端口。在本教程中,我们只保留默认端口 (1099)。如果您提供了其他端口号,则必须在本教程的每一部分进行适当的更改。另外,在本教程中,我们不指定属性文件。(针对您自己的应用程序,我们将提供一个向导来帮助您创建管理属性文件。)</p>
</li>
<li>从主菜单中选择 "Debug"(调试)> "Run Main Project with Monitoring and Management"(通过监视和管理运行主项目)以启动 Anagram Game 应用程序。
<p>或者,单击工具栏中的 "Run Main Project with Monitoring and Management"(通过监视和管理运行主项目)按钮 (<img alt="工具栏中的 &amp;quot;Run Main Project with Monitoring and Management&amp;quot;(通过监视和管理运行主项目)按钮" src="../../../images_www/articles/74/java/jmx/run-project24.png" title="&amp;quot;Run Main Project with Monitoring and Management&amp;quot;(通过监视和管理运行主项目)按钮" />)。</p>
<p>当您运行该应用程序时,"Anagram Game" 窗口将打开。JVM 在本地主机端口 1099 上监听 RMI 访问。JMX 代理正在运行并等待管理器发送管理请求。</p>
<img alt="Anagram Game" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-anagram.png" title="Anagram Game">
<p>您可以最小化 Anagram 窗口,但不退出应用程序。</p>
</li>
</ol>
<a name="Exercise_3"></a>
<h2>创建管理器项目</h2>
<p>在此练习中,您将创建一个名为 <tt>JMXAnagramManager</tt> 的 Java 应用程序项目,然后使用向导创建可运行的管理器类。</p>
<div class="indent">
<h3>创建项目</h3>
<ol>
<li>选择 "File"(文件)> "New Project"(新建项目)(Ctrl-Shift-N 组合键)。</li>
<li>选择 "Java" 类别中的 "Java Application"(Java 应用程序)。单击 "Next"(下一步)。<br> <img alt="&amp;quot;New Java Project&amp;quot;(新建 Java 项目)向导的屏幕快照" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-newjavaproject.png" title="&amp;quot;New Java Project&amp;quot;(新建 Java 项目)向导"></li>
<li>键入 <strong>JMXAnagramManager</strong> 作为项目名称。</li>
<li>选择 "Set as Main Project"(设置为主项目)(如果未选中)并取消选择 "Create Main Class"(创建主类)。单击 "Finish"(完成)。
<p class="notes"><strong>注:</strong>您将在下一个练习中使用 JMX 管理器向导生成可运行的主类。 </p>
</li>
</ol>
<p>单击 "Finish"(完成)后,新项目将添加到 "Projects"(项目)树中。请注意,JMX 管理器项目就像任何其他 Java 应用程序项目一样。 </p>
<a name="Exercise_4"></a>
<h3>创建可运行的管理器类</h3>
<p>在此练习中,您将了解如何使用 JMX 管理器向导生成可运行的管理器类。</p>
<ol>
<li>确认将 JMXAnagramManager 项目设置为主项目。 </li>
<li>选择 "File"(文件)> "New File"(新建文件)(Ctrl-N 组合键;在 Mac 上为 ⌘-N 组合键),然后在 "JMX" 类别中选择 "JMX Manager"(JMX 管理器)。单击 "Next"(下一步)。<br /> <img alt="&amp;quot;New File&amp;quot;(新建文件)向导中的 JMX 管理器模板的屏幕快照" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-newjmxmanager.png" title="&amp;quot;New File&amp;quot;(新建文件)向导中的 JMX 管理器模板" /></li>
<li>键入 <strong>AnagramsManager</strong> 作为类名。</li>
<li>键入 <strong>com.toys.anagrams.manager</strong> 作为包名称。</li>
<li>确认选中 "Generate Main Method"(生成 main 方法)、"Set as Project Main Class"(设置为项目主类)和 "Generate Sample MBean Discovery Code"(生成样例 MBean 发现代码)。单击 "Next"(下一步)。</li>
<li>单击 "Edit"(编辑)以输入要连接到的 JMX 代理 URL。</li>
<li>接受 "RMI JMX Agent URL"(RMI JMX 代理 URL)对话框中的默认值。单击 "OK"(确定)。
<p>"RMI JMX Agent URL"(RMI JMX 代理 URL)对话框将帮助您输入有效的 JMX URL(由协议、主机、端口和 URL 路径组成)。</p>
<img alt="&amp;quot;RMI JMX Agent URL&amp;quot;(RMI JMX 代理 URL)对话框的屏幕快照" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-jmxagenturl.png" title="&amp;quot;RMI JMX Agent URL&amp;quot;(RMI JMX 代理 URL)对话框中的默认值" />
<p>在协议下拉列表中提供单个元素。"Protocol"(协议)字段是可写的,您可以在该字段中输入自己的协议。默认协议 "RMI JVM Agent"(RMI JVM 代理)是用于连接到 JDK JMX 代理的 RMI 协议。您先前在本教程中启动的代理具备此性质。 </p>
<p>您需要使用默认主机和端口值,因为代理正在监听 <tt>localhost:1099</tt>。"URL Path"(URL 路径)字段是只读的,并显示如何为 RMI JVM 代理构造路径。自动使用主机和端口值更新 "URL Path"(URL 路径)。</p>
<p>单击 "OK"(确定)后,将根据 "RMI JMX Agent URL"(RMI JMX 代理 URL)对话框中指定的详细信息使用完整 URL 更新 "JMX Agent URL"(JMX 代理 URL)字段。</p>
</li>
<li>确认选中 "Authenticated Connection"(已验证连接)和 "Generate Sample Code for Authenticated Connection"(为已验证连接生成样例代码)。单击 "Finish"(完成)。<br> <a href="../../../images_www/articles/74/java/jmx/jmx-jmxagenturl2.png" id="jmxagent" rel="lytebox" title="显示 &amp;quot;JMX Agent URL&amp;quot;(JMX 代理 URL)的 &amp;quot;New JMX Manager&amp;quot;(新建 JMX 管理器)向导"> <img alt="显示 &amp;quot;JMX Agent URL&amp;quot;(JMX 代理 URL)面板的 &amp;quot;New JMX Manager&amp;quot;(新建 JMX 管理器)向导的屏幕快照" class="margin-around b-all" src="../../../images_www/articles/74/java/jmx/jmx-jmxagenturl2-sm.png" title="单击查看大图"></a>
<p>与代理的连接未经过验证,因为您在启动代理时未提供任何验证配置。</p>
</li>
</ol>
<p>单击 "Finish"(完成)后,IDE 将创建管理器类并在编辑器中打开文件。您可以看到 IDE 生成了一些样例代码以生成经过验证的连接。</p>
</div>
<a name="Exercise_5"></a>
<h2>运行管理器</h2>
<p>在此练习中,您将了解如何运行管理器并发现 MBean。 </p>
<ol>
<li>在 AnagramsManager.java 文件中,取消注释位于 main 方法中的 MBean 发现代码,这样一来,代码应如下所示:
<pre>
public static void main(String[] args) throws Exception {
//Manager instantiation and connection to the remote agent
AnagramsManager manager = AnagramsManager.getDefault();
// SAMPLE MBEAN NAME DISCOVERY. Uncomment following code:
Set resultSet =
manager.getMBeanServerConnection().queryNames(null, null);
for(Iterator i = resultSet.iterator(); i.hasNext();) {
System.out.println("MBean name: " + i.next());
}
// Close connection
manager.close();
System.out.println("Connection closed.");
}
</pre>
</li>
<li>在编辑器中右键单击,然后选择“修复导入”(Alt-Shift-I 组合键;在 Mac 上为 ⌘-Shift-I 组合键),以生成所有必要的 import 语句(<tt>java.util.Set</tt><tt>java.util.Iterator</tt>)。保存所做的更改。</li>
<li>从主菜单中选择“运行”>“运行主项目”。
<p>或者,在“项目”窗口中右键单击 JMXAnagramManager 项目节点,然后选择“运行”。</p>
<p>选择“运行”后,JMXAnagramManager 应用程序将启动并连接到远程代理,在“输出”窗口中显示发现的 MBean 名称,然后关闭连接: </p>
<p>编译项目并启动管理器。在“输出”窗口中显示发现的 <tt>ObejctNames</tt>。您会看到 <tt>AnagramsStats</tt> MBean 名称以及 Java VM MBean。所有 Java VM 标准 MBean 均位于 <tt>java.lang</tt> JMX 域下方。</p>
<p>下面是您应该会在 JMXAnagramManager 运行的 NetBeans“输出”窗口中看到的内容:</p>
<pre>
init:
deps-jar:
compile:
run:
MBean name: java.lang:type=MemoryManager,name=CodeCacheManager
MBean name: java.lang:type=Compilation
MBean name: java.lang:type=MemoryPool,name=PS Perm Gen
MBean name: com.sun.management:type=HotSpotDiagnostic
MBean name: java.lang:type=Runtime
MBean name: com.toy.anagrams.mbeans:type=AnagramsStats
MBean name: java.lang:type=ClassLoading
MBean name: java.lang:type=Threading
MBean name: java.lang:type=MemoryPool,name=PS Survivor Space
MBean name: java.util.logging:type=Logging
MBean name: java.lang:type=OperatingSystem
MBean name: java.lang:type=Memory
MBean name: java.lang:type=MemoryPool,name=Code Cache
MBean name: java.lang:type=GarbageCollector,name=PS Scavenge
MBean name: java.lang:type=MemoryPool,name=PS Eden Space
MBean name: JMImplementation:type=MBeanServerDelegate
MBean name: java.lang:type=GarbageCollector,name=PS MarkSweep
MBean name: java.lang:type=MemoryPool,name=PS Old Gen
Connection closed.
BUILD SUCCESSFUL (total time: 1 second)
</pre></li>
</ol>
<!--
<a name="Exercise_6"></a>
<h2>Exercise 6: Updating the Manager Class with Management Logic</h2>
<p>In this exercise you will learn how to make a simple JMX request to access
an MBean attribute. We will update the manager class main method in order to
access the <tt>NumResolvedAnagrams</tt> attribute. This attribute represents
the number of anagrams solved. </p>
<h3>Steps to Follow</h3>
<ol>
<li>In the main method, before closing the connection we are going to perform
the following actions:
<ul>
<li>Access the <tt>MBeanServerConnection</tt>.&nbsp; The <tt>MBeanServerConnection</tt>
class allows you to make requests to the remote server.</li>
<li>Create the Anagrams statistics MBean <tt>ObjectName</tt>. The name is
copied/pasted from the output. An object name is needed when a request
is sent to a remote agent in order to specify the MBean from which to
get the atribute.</li>
<li>Get the attribute <tt>NumResolvedAttribute</tt>.</li>
<li>Print the attribute value to the output.</li>
</ul>
To do so, copy and paste the four lines of code below at the end of the
AnagramsManager.java main method, right before the close conection lines:
<pre>
MBeanServerConnection connection = manager.getMBeanServerConnection();
ObjectName name = new ObjectName("com.toy.anagrams.mbeans:type=AnagramsStats");
Integer num = (Integer) connection.getAttribute(name, "NumSolvedAnagrams");
System.out.println("NumSolvedAnagrams : " + num);
</pre>
You may need to add an import clause for <tt>javax.management.ObjectName</tt>
</li>
<li>Once you have updated the source code, you can play with the Anagrams game
then run the project again in order to see the updated values.
In the NetBeans Output Window of the JMXAnagramManager run you should now see
at the end, before the connection closed, the added line:
<pre>
NumSolvedAnagrams : 0
</pre></li>
</ol>
-->
<p><b>是的,您完成了!做得好!</b><br /> 我们希望本教程已经帮助您了解如何开发管理器应用程序,以便访问借助 JMX 导出的信息。 </p>
<div class="feedback-box">
<a href="/about/contact_form.html?to=3&amp;subject=Feedback:%20Developing%20a%20Java%20Management%20Extensions%20Manager">发送有关此教程的反馈意见</a></div>
<br style="clear:both;">
<h2>另请参见</h2>
<p>有关详细信息,请参阅以下主题:</p>
<ul>
<li><a href="jmx-getstart.html">NetBeans IDE 中的 JMX 监视入门指南</a></li>
<li><a href="jmx-tutorial.html">将 Java 管理扩展 (JMX) 分析添加到 Java 应用程序中</a></li>
</ul>
</body>
</html>