- 浏览: 77609 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
chenshuyi:
感谢分享! 学习DOS批处理很好的资料,感谢楼主,感谢博 ...
编写批处理文件 -
康跷_0613:
请问利用逆向工程怎么分析出类图,哪里有相关详细的介绍呢?
Tomat6的整体架构 -
康跷_0613:
图片看不到了..
Tomcat6.0源码学习--架构概述 -
cshuser:
中介者模式 用一个中介对象来封装一系列的对象交互。中介者使 ...
JMX在Tomcat中的应用(四) -
lh870003574:
1.1的示例中,针对你提出的对修改关闭的问题,没有找到你所说的 ...
JMX在Tomcat中的应用(二)
下面,我们举一个简单的例子,理解一下
JMX
中中的各个概念。我们家有一个中央热水系统
(Central Heater System)
,它是我们家的一个资源,现在我们想通过
JMI
进行管理。现有的代码如下所示,当然,为简单起见,我们略去了一些
JNI
调用代码,因为厂家提供的
API
是用
C
语言写的。
a)
热水器接口
(
CentralHeaterInf
.java
)
的现有代码:
package
carl.test.jmx;
/**
*
The
interface
of
Central
Heater
*
@author
carlwu
*
*/
public
interface
CentralHeaterInf {
/**
*
The
heater
is
provided
by
British
Gas
Company
*/
public
final
static
String
HEATER_PROVIDER
=
"British Gas Company"
;
/**
*
Get
current
temperature
of
heater
*
@return
the
temperature
of
the
heater
*/
public
int
getCurrentTemperature();
/**
*
Set
the
new
temperature
*
@param
newTemperature
*/
public
void
setCurrentTemperature(
int
newTemperature);
/**
*
Turn
on
the
heater
*/
public
void
turnOn();
/**
*
Turn
off
the
heater
*/
public
void
turnOff();
}
b)
热水器实现代码的现有代码
(CentralHeaterImpl
.java
)
/**
*
The
implemenation
of
Central
Heater
*
@author
carlwu
*
*/
package
carl.test.jmx;
public
class
CentralHeaterImpl
implements
CentralHeaterInf {
int
currentTemperature
;
public
int
getCurrentTemperature() {
return
currentTemperature
;
}
public
void
setCurrentTemperature(
int
newTemperature) {
currentTemperature
=newTemperature;
}
public
void
turnOff() {
System.
out
.println(
"The heater is off. "
);
}
public
void
turnOn() {
System.
out
.println(
"The heater is on.
"
);
}
}
1.1
资源植入层
(Instrumentation Level)
代码示例
我们如何让
JMX
对我们的中央热水器进行管理呢
?
首先,我们并不想让远程管理者能够关闭我们的中央热水器,因为热水器一旦关上,我们再也无法访问厂家提供的
API
。既然不能关闭它,我们的
MBeans
中也就不需要打开
(turnOn)
方法。所以,我们简单定义的
MBeans
接口如下:
package
carl.test.jmx;
/**
*
@author
carlwu
*
*/
public
interface
CentralHeaterImplMBean {
/**
*
return
the
heater
provider
*
@return
*/
public
String getHeaterProvider();
/**
*
Get
current
temperature
of
heater
*
@return
the
temperature
of
the
heater
*/
public
int
getCurrentTemperature();
/**
*
Set
the
new
temperature
*
@param
newTemperature
*/
public
void
setCurrentTemperature(
int
newTemperature);
/**
*
Print
the
current
temperature
of
the
heater
*
@return
the
string
of
current
temperature
*/
public
String printCurrentTemperature();
}
上面的
MBean
接口及其简单,意义也非常明显,我们只向管理程序公开热水器的生产厂家
(
该属性为只读,管理程序不能更改热水器的生产厂家
)
,但管理程序可以获取并更改当前热水器的温度,并且可以打印出热水器的当前温度。
接下来,我们要做的,就是更改我们已有的
CentralHeaterImpl.java
代码,让它实现
CentralHeaterImplMBean
接口,同时实现
CentralHeaterImplMBean MBean
中规定的所有方法。
CentralHeaterImpl.java
更改后的源代码如下:
/**
*
The
implemenation
of
Central
Heater
*
@author
carlwu
*
*/
package
carl.test.jmx;
public
class
CentralHeaterImpl
implements
CentralHeaterInf,CentralHeaterImplMBean {
int
currentTemperature
;
public
int
getCurrentTemperature() {
return
currentTemperature
;
}
public
void
setCurrentTemperature(
int
newTemperature) {
currentTemperature
=newTemperature;
}
public
void
turnOff() {
System.
out
.println(
"The heater is off. "
);
}
public
void
turnOn() {
System.
out
.println(
"The heater is on. "
);
}
public
String getHeaterProvider() {
//
TODO
Auto-generated method stub
return
HEATER_PROVIDER
;
}
public
String printCurrentTemperature() {
String printMsg=
"Current temperature is:"
+
currentTemperature
;
System.
out
.println(printMsg);
return
printMsg;
}
}
到此为止,我们的资源植入层
(Instrumentation Level)
的代码全部完成,它主要由一个
MBean(CentralHeaterImplBean)
及其实现类
CentralHeaterImpl
组成,在
CentralHeaterImplBean
这个
MBean
接口中,我们说明了要向管理程序暴露的属性和方法,在本例中,我们的管理程序可以访问热水器的生产厂家信息,同时还可以获取和设置并打印热水器的温度。在
MBean
的实现类中,我们实现了
MBean
接口中规定的所有方法。
然而,在上面的实现中,我们更改已有的
CentralHeaterImpl.java
代码。但从代码编写的角度看,这种做法违反了软件设计的基本原则
—
开闭原则。我们已有的
CentralHeaterImpl.java
类已经经过多次测试,消除了所有的
Bug
,现在为了支持
JMX
,我又增加方法,又修改代码,这会让原本运行得很好的系统重新产生
Bug
。您不妨思考一下,如何不修改
CentralHeaterImpl
类的代码,但又让使
JMX
能够管理我们家的热水器呢?请参考本文的附录,看看您的想法是否比我提供的参考实现高明些?
1.2
代理层
(Agent Level)
示例代码
import
java.lang.management.ManagementFactory;
import
javax.management.MBeanServer;
import
javax.management.ObjectName;
/**
*
@author
carlwu
*
*/
public
class
CentralHeaterAgent {
private
static
MBeanServer
mBeanServer
;
/**
*
@param
args
*/
public
static
void
main(String[] args)
throws
Exception {
ObjectName oname;
// get the default MBeanServer from Management Factory
mBeanServer
= ManagementFactory.getPlatformMBeanServer
();
// try {
// create a instance of CentralHeaterImpl class
CentralHeaterInf centralHeater =
new
CentralHeaterImpl();
// assign a Object name to above instance
oname =
new
ObjectName(
"MyHome:name=centralheater"
);
// register the instance of CentralHeaterImpl to MBeanServer
mBeanServer
.registerMBean(centralHeater, oname);
System.
out
.println(
"Press any key to end our JMX agent..."
);
System.
in
.read();
}
}
您可以看到,上面的代理层代码异常简单。前面讲过,代理层中最重要的对象就是
MBeanServer
,我们可以把
MBeanServer
理解为一个全局的
HashMap
,所有的
MBeans
都通过唯一的名字注册到这个
HashMap
,这个
HashMap
可以跨越
JVM
访问,甚至可以通过
RMI
、
Http
及其它手段跨越网络传输到其它机器,让其它机器也能访问这个
MBeanServer
中注册的对象。下面我们稍微理解一下代理层代码,在
main()
方法中,
a)
首先我们从
ManagementFactory
的工厂方法中获得
MBeanServer
对象;
b)
然后实例化我们的热水器对象,注意这个对象声明为
CentralHeaterInf
,而不是
CentralHeaterImplMBean
。
JMX
规范并没有规定对象声明,只要这个对象实现了一个以
SomethingMBean
命名的接口或父类即可;
c)
接下来通过
new ObjectName(String)
构造函数给我们的
MBean
一个全局的名字,这个名字一般的格式是:
”
域名
:
属性
1=*,
属性
2=*,…”
构成;
d)
第四步,我们调用
MBeanServer
的
regiesterBean
方法,通过第三步声明的全局名字把我们的
MBean
实例注册到
MBeanServer
。
这几步都非常简单明了。下面我们在
Eclipse
中运行代理层代码,运行时,请加上下面几个
JVM
运行时参数:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.ssl="false"
-Dcom.sun.management.jmxremote.authenticate="false"
这四个
JVM
运行时参数的意义是,
MBeanServer
允许其它管理程序通过
RMI
方式访问,
RMI
端口是
9999
,
RMI
不使用
SSL
协议,也不需要验证。
Eclipse
的
Run
窗口如下:
然后,请在上面的窗口中点击
Run(
运行
)
按钮,运行代理层程序。
1.3
管理层代码
管理层代码编写起来其实也比较简单,但如果您要求界面比较完美,并且您也不想卷入到
AWT
加
Swing
的面条代码中,您最好直接使用
JDK
自带的
JConsole.exe
程序,这个程序位于
JDK\bin
目录下,可直接运行。下面我们观察管理程序在远程和本地运行情况。
a)
远程运行
JConsole
管理程序
请双击
JConsole.exe
或者通过命令行在本机上启动
JConsole.exe
,在
JConsole
的连接界面,选择远程连接,然后输入
RMI
地址和端口号,本例为
localhost:9999
,注意确保我们上面编写的
CentralHeaterAgent
代理处于运行状态,远程连接界面如下图所示:
连接成功后,请点击
MBean
标签,并展开
MyHome
节点,我们可以观察到
CentralHeaterImplMBean
中暴露给管理程序所有的属性和方法,如下图所示:
我们在
CentralHeaterImplMBean
接口中规定,
CurrentTemperature
属性是可以更改的,所以上图中
CurrentTemperature
的值显示为绿色,表示远程管理者可以调节;但
HeaterProvider(
生产厂家
)
的属性是不能更改的,所以其值显示为灰色。现在,我们以远程管理用户的身份,把
CurrentTemperature
属性的值改为
25
,并按回车或者点击刷新按钮,接下来您可以在上面的界面中,调用操作方法
printCurrentTemperature()
,您会在弹出的对话框中看到“
Current temperature is:25
”的字样,这说明我们的温度更改成功。请注意这是通过远程
RMI
完成的。
b)
本地运行
JConsole
管理程序
请关闭上步中打开的
JConsole
,然后重新运行
JConsole.exe
程序,选择本地进程中的
carl.test.jmx.CentralHeaterAgent
程序,并单击“连接”按钮,图示如下。
您在本地的管理程序中可以观察到,
MyHome
节点下的
centralheater
的
CurrentTemperature
的值已经改为
25
,这个更改时通过远程方式完成的。
到此为止,
JMX
的小例子就结束了,您可能有些疑惑。
a)
首先,
JMX
从表现形式上看似
RMI
或者
EJB
,是一种分布式计算,对吗?
b)
其次,我们在注册
MBean
时,开始声明了一个
MBean
对象,然后把这个对象注册到
MBeanServer
,那么,所有的操作都只能操纵这个对象,对吧?假设我们在程序的其它地方,又新创建了这个
MBean
的另一个实例,这时,我们如何管理这个新创建的实例呢?
我们先来思考一下
JMX
和
RMI/EJB
的区别,
RMI/EJB
是分布式计算的一种,它们通过
Stub
和
Skeleon
的方式,在服务器和客户端之间传输
Bean
实例,所以客户端必须知道服务器端
Bean
的接口;客户端可以获得服务器端的实例对象,并能调用这个实例对象的方法,被调用的方法其实是在客户端运行的,方法的运行需要占用客户端资源。但
JMX
不同,
JMX
管理程序
(
类似于
EJB/RMI
的客户端
)
不需要了解服务器中
Bean
的任何接口的信息,更不需要从服务器上获取正在运行的实例,所有方法的调用均在服务器端完成,管理程序只是用来监视或者管理服务器中注册的
MBeans
。
再说说
JMX
如何管理新实例的问题,我们知道,
JMX
管理的是资源。何谓资源,资源一般代表真实存在的事物。比如说上面例子中的热水器,我们家只有一个热水器,所以一个
MBean
的实例足矣,不必使用
new
来创建另一个实例。但是,您可能会问,我们家假如有两个热水器怎么办?在这种情况下,我们需要两个
MBean
的实例,把它们分别命名为
"MyHome:name=centralheater_1"
和
"MyHome:name=centralheater_2"
,并注册到
MBeanServer
,这两个热水器之间没有任何关系,就和
Java
中同一个类的两个实例类似。当然,同一个类的两个实例之间可以通过
static
属性共享资源。一般说来,
JMX
中的
MBean
对应的是真实世界里存在的事物,或者服务器中独一无二的对象,这些对象往往长期驻留在内存中,所以需要管理。如果您新建一个实例,等您的方法退出之后,垃圾回收器马上将这个对象清理掉,您也没有必要使用
JMX
来管理这种昙花一现的对象,对吗?
评论
我的想法是:应用门面模式(facade),新引入一个类,作为CentralHeaterImpl的门面,但只暴露CentralHeaterImplMBean所需要的方法。门面模式在tomcat中广为应用啊~~
发表评论
-
Tomcat6.0源码学习--架构概述
2010-02-26 15:26 2680Tomcat6 是最新版本的 ... -
Tomcat5启动流程与配置详解
2009-11-06 17:26 1183How to config and run The Apac ... -
《How Tomcat Works》读书笔记(五):生命周期
2009-11-06 16:26 950第一次接触到“生命周期”这个词汇,是在软件工程的课程上,“软件 ... -
《How Tomcat Works》读书笔记(四):容器初探
2009-11-06 16:25 1331第四章:容器初探 接触JAVA EE以来,最初对“容 ... -
《How Tomcat Works》读书笔记(三):Tomcat default connector
2009-11-06 16:24 1449Chapter 4: Tomcat default conn ... -
《How Tomcat Works》读书笔记(一)
2009-11-06 16:23 1346看了这本书的头三章,写得非常好,可谓深入浅出将tomcat分析 ... -
《How Tomcat Works》读书笔记(二):Connector
2009-11-06 16:19 1275Chapter Three:Connector to ... -
编写批处理文件
2009-11-06 16:15 1189嘿嘿,批处理的介绍。不光可以提高自己动手能力还能学到很多知识, ... -
分析 Tomcat catalina.bat 脚本
2009-11-06 15:03 2175Catalina.bat是tomcat所有脚本中最重要的 ... -
JMX在Tomcat中的应用(四)
2009-11-06 14:52 1314四、 Tomcat 中最简单的 MBean 下面 ... -
JMX在Tomcat中的应用(三)
2009-11-06 14:37 2141三、 Tomcat 中的 JMX 通过上面 ... -
JMX在Tomcat中的应用(一)
2009-11-06 14:33 1841一、 JMX 简单介绍 Tomcat 从 5. ... -
Tomat6的整体架构
2009-11-06 14:28 1529在上篇文章中,我们已经成功将Tomcat6.0 的源代码导入 ... -
Tomat6架构探讨
2009-11-06 14:27 1653下面,我们重点针对 Ca ... -
Tomcat启动遇到的常见问题
2009-11-06 14:24 2489如果一切顺利,我们就可以看到非常熟悉的 Tomcat 窗口 ... -
Catalina.bat脚本解析
2009-11-06 14:21 3666当 startup 脚本完成环境变量的设置后,就开始调 ...
相关推荐
主要介绍了Tomcat开启JMX服务方法的相关内容,小编觉得挺不错的,在这里给大家分享一下,需要的朋友可以参考。
本书深入剖析Tomcat4和Tomcat5中的每个组件,并揭示其内部...本书从最基本的HTTP请求开始,直至使用JMX技术管理Tomcat中的应用程序,逐一剖析Tomcat的基本功能模块,并配以示例代码,使读者可以逐步实现自己Web服务器。
Tomcat源码研究.pdf。Catalina脚本解析,Tomcat启动遇到的常见问题,架构探讨,JMX在tomcat中的应用,容器初探,生命周期
本书深入剖析Tomcat 4和Tomcat 5中的每个组件,并揭示...本书从最基本的HTTP请求开始,直至使用JMX技术管理Tomcat 中的应用程序,逐一剖析Tomcat 的基本功能模块,并配以示例代码,使读者可以逐步实现自己的Web服务器。
《深入剖析Tomcat》从最基本的HTTP请求开始,直至使用JMX技术管理Tomcat中的应用程序,逐一剖析Tomcat的基本功能模块,并配以示例代码,使读者可以逐步实现自己的Web服务器。 目录 第1章 一个简单的web服务器 1.1...
资源是关于tomcat深入剖析的源码. ...本书从最基本的HTTP请求开始,直至使用JMX技术管理Tomcat中的应用程序,逐一剖析Tomcat的基本功能模块,并配以示例代码,使读者可以逐步实现自己的Web服务器。
Apache Tomcat 5.0.x在Apache Tomcat 4.1的基础上做了很多改动,包括: · 性能优化和减少垃圾回收动作 · 重构程序部署,通过一个可选的独立部署程序,允许在将一个web应用放进产品前验证和编译它 · 基于JMX的...
在内容上,《深入剖析Tomcat》更关注对Tomcat基本体系结构的讲解,并没有涉及在实际应用中的具体实现细节。希望读者在阅读的时候,着重把握Torrical的一些设计思想,在此基础上,再针对某一方面进行深入的学习和研究...
的Apache Tomcat 5.5.X支持相同的Servlet和JSP规范版本的的Apache Tomcat 5.0.x中 还有在许多领域显著变化引擎盖下,从而提高了性能,稳定性和总拥有成本。有关详细信息,请参阅Apache Tomcat 5.5 Changelog。 的...
Ansible角色:在多个正在运行的实例中安装Apache Tomcat Java应用程序服务器(可选使用Hugepages) 在多个正在运行的实例中安装Apache Tomcat Java应用程序服务器。 最完整的Tomcat安装,支持,init.d脚本,应用...
由于Tomcat允许开发者只需通过加入一行致谢,就可以把Tomcat嵌入到它们的应用中。遗憾的是,许多商业应用服务器并没有遵守此规则。 对于开发者来说,如果是为了寻找利用Servlet、JSP、JNDI和JMX技术来生成JavaWeb...
利用zabbix JMX 自带模板应用服务监控 tomcat,帮助初学的朋友,是他们能很快上手
│ ch17.rar 将Tomcat嵌入到Java中(实例演示) │ ch19(security).rar Tomcat安全(实例演示) │ ch24.rar IIS与Tomcat集成(实例演示) │ ├─ch20 JMeter压力测试实例(实例演示) │ classes12.jar ...
16.2 tomcat中的shutdown hook 131 第17章 启动tomcat 133 17.1 概述 133 17.2 Catalina类 133 17.2.1 start方法 134 17.2.2 stop方法 135 17.2.3 启动Digester 135 17.2.4 关闭Digester 135 17.3 Bootstrap类 136 ...
JConsole是一个基于JMX的GUI工具,用于连接正在运行的JVM,不过此JVM需要使用可管理的模式启动。如果要把一个应用以可管理的形式启动,可以在启动是设置com.sun.management.jmxremote。JConsole能够提供被监控虚拟机...
《深入剖析Tomcat》原始码及笔记 -Tomcat的工作原理开发自己的Java Servlet容器的指南 章节 第三章连接器 第四章Tomcat的默认连接器 第五章servlet容器 第六章生命周期 第七章日志记录器 ...第二十章基于JMX的管理
16.2 tomcat中的shutdown hook 131 第17章 启动tomcat 133 17.1 概述 133 17.2 Catalina类 133 17.2.1 start方法 134 17.2.2 stop方法 135 17.2.3 启动Digester 135 17.2.4 关闭Digester 135 17.3 Bootstrap类 136 ...
正在进行中的JMX Exporter将解决在Java的IP地址未知且RMI-IIOP被禁用(例如Amazon Elastic Beanstalk,Cloudbees等)的云风格和弹性环境中进行远程JMX访问的问题。 如果您有什么要讨论的 入门 启用了Spring ...
fallback 提供了一个很好的示例 Web 应用程序存档(war),用于集成 Spring/Hibernate/JMX/JPA/Ehcache。 为了提出这种干净的集成,您必须筛选大量相互冲突的博客帖子和文档。 我的目标是为您完成这项工作,并提供...
的,主要是EJB、 JNDI和JMX API等J2EE API方面的,还包含事务处理、数据库连接等功能,所以在企业级使用中,使用服务器提供的功能比WEB服务器强大的多。 web服务器和应用服务器全文共6页,当前为第2页。 web服务器...