- 浏览: 704259 次
- 性别:
- 来自: 北京
博客专栏
-
读金庸故事,品程序人生
浏览量:47748
文章分类
最新评论
-
hty881008:
LZ,你的json返回是怎么出来的,我的怎么是No messa ...
使用CXF暴露您的REST服务 -
jxFY:
赞
Apache的对象池化工具commons-pool -
wangyudong:
新版本的Wisdom RESTClient地址https:// ...
使用CXF暴露您的REST服务 -
wangyudong:
由CXF实现的微服务需要有比较好的工具去测试RESTful A ...
使用CXF暴露您的REST服务 -
spring_springdata:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
Maven3实战笔记01环境配置与使用入门
1. JMX规范
JMX是“Java管理扩展的”的缩写,它和其他JavaEE类似也是曾经的Sun提出的一种规范(规约),从名字上可以看出主要是负责系统管理。是一个为系统加入或者说扩展成有管理功能的规约,只要按照这套规约行事,您的系统,某些某块就具备被其他工具(例如JConsole)管理的能力。换句话说就是可以用JMX来监控咱们的系统运行情况,还有可以在运行时环境像Web Service、RMI一样调用系统管理类的一些方法。实现此规范的框架也很多:Spring、Tomcat、JBoss容器……
2. 场景简述
咱们先假设一个情景,夫妻二人。男的因为工作需要要去外地出差,因公司规定,出差不能带家属,女方不能跟过去啊。所以女方给他们2个人一个手机——HTC吧。里面有个小程序,叫做JMXImpl4Android。等到男方出差在外地了,在外地出差的城市,一天晚上和同事散步,路上遇到个发廊(各位男性朋友明白的啊)。此时远在另一个城市的妻子的手机突然响了,手机GIS定位信息告知妻子:“您的丈夫在一个发廊门前徘徊,请注意”。妻子急了,立刻给丈夫打电话:“你干嘛呢?”。丈夫战战栗栗,汗出如浆,乖乖的回酒店玩DOTA了!
我们来用Java消息扩展的视角来看看这个场景,咱们伟大一些相当于那个妻子,那个丈夫就相当于咱们的系统,出差事件相当于咱们将系统部署到了真正的远程的运行环境,妻子曾HTC手机给丈夫您可以理解成把丈夫打造成具有JMX规范的系统,换句话说:此丈夫可监控。因为一个小小的GIS应用就能让妻子随时监控丈夫的状态——想邪恶一把,并且还可以根据系统的状态进行相应的措施——打电话告诉丫的别想出轨,虽然新的婚姻法下来了,但是房子是老娘买的,出轨?你试试!
看到这里,大家估计明白了JMX是什么东西,干什么用的了。但是估计大家有一个疑问,这个和Java分布式系统有什么关系啊?在分布式系统中有时候我们需要监控各个分机器的状态,比如想知道机器此时此刻的Tomcat的运行状况如何,还可以根据状况调用相关的操作,比如shutdown服务、去除已部署的web工程等等与服务有关的操作。或者对于调度这些节点机的主控机器也可以进行监控,在远程使用一个JConsole调用即可。Ok,说了这么多,我们看示例吧,最后再来用实例解释JMX的那些晦涩的理论概念。
3. 监控本机程序
这种场景在实际中不太常用,对于本机的程序来说,需要监控,按需调用被托管的类方法还真不多。
相当于丈夫就在你面前,他的一举一动都在你眼皮底下,你还需要一个Android小程序去监控他吗?笔者使用的是Spring3的实现。所以先将Spring的包下载下来,放到项目的classpath中。
咱们先写一个最普通的JavaBean
package jmx;
public class HusbandLocal {
// 属性
private String name;
private int age;
private String message;
// set,get
public String getName() {
System.out.println("name:"+name);
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
System.out.println("age:"+age);
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getMessage() {
System.out.println("message:"+message);
return message;
}
public void setMessage(String message) {
this.message = message;
}
// 额外的操作,方法
public void call(String message) {
System.out.println("丈夫的call:" + message);
}
public void look(){
System.out.println("发现发廊");
}
public void playDOTA(){
System.out.println("这个不用解释了吧~DOTA");
}
}
以上Bean我们将它像Web Service一样(但是不是啊)暴露成JMX托管服务类。配置Spring文件内容如下
org.springframework.jmx.export.MBeanExporter是Spring暴露管理Bean(MBean)的核心类之一。它使用一个Map类型的属性——beans记录要暴露MBean的类。将咱们刚刚写的HusbandLocal以属性注入的方式注入进去。之后写一个加载Spring文件的main实例,开启服务。
如此,我们完成了一个本地监控MBean对象的小功能。不过就像原来说的,这有个问题就是咱们之前说的,这种本地场景不多见,不常用。Ok,咱们看看要想远程监控需要做些什么事情。 4. 监控远程程序 下面我们尝试在远程监控咱们这个“丈夫”。 首先在Spring配置文件增加以下内容
刚才我们将我们的MBean注册到一个基于RMI访问方式的连接服务上(ConnectorServerFactoryBean),占用的端口是8080。这时启用jconsole以远程方式连接,不用输入密码,如下图所示 之后和在本地操作一样,可以监控MBean的属性状态,也可以进行相应的操作。 5. 监控Web容器 如果我们要监控一下Web服务器,比如Tomcat服务器的JVM状态怎么办?这种场景非常的常见。其实配置也很简单。我们打开{Tomcat_HOME}/bin/catalina.bat,在linux下是{Tomcat_HOME}/bin/catalina.sh文件。将原有的脚本
替换成为
我们运行startup.bat文件,之后开启JConsole,远程登录tomcat
而Tomcat自身这个容易也有很多模块支持JMX规范,可以通过JConsole进行一些MBean的管理 6. 监控JavaEE容器 说完Tomcat这种Web容器,不得不说说JavaEE容器,就将开源的JBoss拉出来看看,其实JBoss自身因为是一个JavaEE容器,而JMX是属于JavaEE5范畴内的规范,所以JBoss自身就拥有很多JMX的特性,比如咱们动态添加一个DataSource资源时候,后台的JBoss控制台console的界面就会自动更新运行时的状态,数据源的连接状态也能一览无余的显示给后台使用者。这些实际上都是JMX的特性。只不过结合了Web页面的UI罢了。其实基于Web页面,大家就能看到JBoss自身的运行状况了 替换成
之后启动JConsole即可远程连接JBoss,地址:192.168.1.100:9999
可以看出Tomcat与JBoss的消耗资源真的不是一个数量级的。 7. 总结 这次是介绍了JMX的使用场景和一些分布式系统中常用的配置和监控情形,对于JMX规范本身,尤其是重要的MBean并没有做过多的介绍,其实MBean有很多种情况,这一篇文章并不能尽述。知道他是干什么,遇到那些晦涩难懂的理论就不再惧怕了,有时间打算下次再详细说说JMX MBean的各种使用情况。<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- 暴露监控设备 -->
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"
lazy-init="false">
<property name="beans">
<map>
<entry key="bean:name=HusbandLocal" value-ref="HusbandLocal" />
</map>
</property>
</bean>
<!-- mbean -->
<bean id="HusbandLocal" class="jmx.HusbandLocal" />
</beans>
// 加载配置文件
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");
// 通过死循环保证主线程一直运行
while (true) {
}
点击进去后可以查看咱们刚才暴露的MBean,如下
我们可以点击MBean的操作,比如playDOTA(),后台就调用了该方法。在这个界面还可以看到MBean的属性值,你叫他们状态也行。
<!-- 远程连接 RMI方式-->
<!--
地址输入
service:jmx:rmi://localhost/jndi/rmi://192.168.1.100:8080/myconnector
-->
<bean class="org.springframework.jmx.support.ConnectorServerFactoryBean"
depends-on="rmiRegistry">
<property name="objectName" value="connector:name=rmi" />
<!-- 远程连接的地址 -->
<property name="serviceUrl"
value="service:jmx:rmi://localhost/jndi/rmi://localhost:8080/myconnector" />
</bean>
<!-- 使用JNDI-RMI的方式进行远程连接通讯,并且配置占用端口号 -->
<bean id="rmiRegistry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean">
<property name="port" value="8080" />
</bean>
set LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
rem 配置JMX服务端口
set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.port=10090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"
之后即可查看远程Tomcat资源
如果需要JConsole连上远端的JBoss,和Tomcat一样,需改一下配置文件run.bat,linux的就不赘述了,将以下代码段
if "x%JAVA_OPTS%" == "x" (
set "JAVA_OPTS=-Dprogram.name=%PROGNAME%"
) else (
set "JAVA_OPTS=-Dprogram.name=%PROGNAME% %JAVA_OPTS%"
)
if "x%JAVA_OPTS%" == "x" (
set "JAVA_OPTS=-Dprogram.name=%PROGNAME% -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
) else (
set "JAVA_OPTS=-Dprogram.name=%PROGNAME% -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false %JAVA_OPTS%"
)
评论
特别是老公、老婆的那个例子,感觉很明晰,
学习分布式时,楼主用那些教材呢?
麻烦推荐一下。谢谢了。
书籍:
林昊的《Java分布式集群:基础与实践》
《云计算实践第二版》
李刚老师的《JavaEE5》
工业出版社的《Java并发编程》
其他的资源就来自一些网上查询的资料了。
谢谢lz分享,学习了
我觉得也是,这种场景lz都能想到,人才,真是人才!
啊,哦,我忘了交待了。在{Java_HOME}\bin下面有一个jconsole.exe。打开即可。
谢谢lz,找到了。
啊,哦,我忘了交待了。在{Java_HOME}\bin下面有一个jconsole.exe。打开即可。
确实,这些相互竞争的架构,思想不变,每个platform都有相关自己的实现。
哎呀,这个场景有点严肃啊,不值一提。
发表评论
-
Java分布式应用学习笔记09JMX-MBean的介绍(JMX的一点点补充)
2011-10-09 09:01 74961. MBean介绍 从上一篇B ... -
Java分布式应用学习笔记07线程池应用(又名:线程池与大排档)
2011-09-07 09:00 72241. 线程池是啥子 一说到池子,大家都会想到数据库连接池那 ... -
Java分布式应用学习笔记06浅谈并发加锁机制分析
2011-08-19 16:12 80931. 前言 之前总结的多线程的调度、并发调度、线程加锁安全 ... -
Java分布式应用学习笔记05多线程下的并发同步器----后篇
2011-08-11 09:07 70275. CountDownLatch 很多资料上都说Coun ... -
Java分布式应用学习笔记05多线程下的并发同步器----前篇
2011-08-11 09:02 93901. 前言 JDK提供的并发包,除了上一篇提到的用于集合外 ... -
Java分布式应用学习笔记04JDK的并发包的集合总结---后篇
2011-08-02 17:21 4501唉~这一大篇blog又是只能显示部分,部分内容被截断了。。。。 ... -
Java分布式应用学习笔记04JDK的并发包的集合总结---前篇
2011-08-02 17:17 54091. 前言 平时咱们使用的HashMap、ArrayLis ... -
Java分布式应用学习笔记03JVM对多线程的资源同步和交互机制
2011-07-28 10:55 66561. 前言 既然是分布式 ... -
Java分布式应用学习笔记02再谈JVM---续
2011-07-25 09:22 3825唉~~因为blog总显示不全只能分为2个了,排版也不是很好,凑 ... -
Java分布式应用学习笔记02再谈JVM
2011-07-25 09:10 58781. 前言-为何要再谈JVM 很多人认为,分布式Java应 ... -
Java分布式应用学习笔记01分布式Java应用和SOA
2011-07-22 13:52 42591. 前言 当我们所做的 ... -
使用Memcached做分布式系统的Session存储
2011-07-01 10:12 85241. 前言 Memcache除了可以做Hibernate的 ... -
用xmemcache作为JPA(Hibernate实现)二级缓存
2011-06-30 09:44 60891. 持久层的缓存 Hibern ... -
Apache_proxy负载均衡和Session复制
2011-04-06 09:26 10888今天上网查了查资料,之前使用apache的jk模块做负载均衡。 ... -
Java基于线程的分布式(转自cjnetwork)
2011-03-22 17:50 1734java基于线程的分布式 ... -
JBoss集群配置的Session复制
2011-03-21 09:19 59881. 前言 接着上一篇总结文章提出的问题,这次通 ... -
JBoss节点的负载均衡与Mysql主从备份
2011-03-16 22:37 25151. 前言 做JavaEE企业级应用就离不开集群 ... -
在default目录下快速配置JBoss集群(Web方面) 转载
2011-03-06 10:24 2250说起JBoss集群好像很高深的样子,其实一点也不恐怖,建立一个 ...
相关推荐
Java Management Extensions (JMX) 是Java平台上的一个标准,它定义了一种管理和监控Java应用程序的机制。JMX规范允许开发者创建可管理的组件,并通过管理系统(如JConsole)进行监控和控制。这些组件称为MBeans...
10. **Java Management Extensions (JMX)**:JMX用于监控和管理Java应用程序,提供了创建、注册和管理管理对象的框架。 11. **Application Servers**:了解常用的Java EE应用服务器,如Apache Tomcat、WildFly和...
Java架构面试专题涵盖了Java开发语言的核心知识、高级特性、并发编程、内存管理、垃圾收集、JVM优化、设计模式、框架应用、数据库交互、微服务架构等多个方面,这些都是面试中常被问到的关键点。本专题旨在帮助Java...
8. 监控与调优Kafka提供丰富的监控指标,如消息生产和消费速率、延迟、副本同步状态等,可以通过JMX或Prometheus等工具收集。调优包括调整 broker 配置(如缓冲区大小、网络连接数)、消费者配置(如批处理大小、...
- JMX:Java管理扩展,用于远程监控和管理Java应用程序。 5. **IO流** - 字节流与字符流:理解两者区别,学习BufferedReader、BufferedWriter、FileInputStream等类的使用。 - NIO(New IO):讲解非阻塞I/O,...
【Java架构师笔记——John_H】是一份针对Java架构师认证考试的重要学习资源,由知名专家John H提供。这份资料全面覆盖了Java架构设计的核心概念和技术,旨在帮助备考者深入理解并掌握成为一名合格的Java架构师所需的...
**GemFire 学习笔记** GemFire 是一款高性能、分布式内存数据网格系统,由 Pivotal 公司开发,主要用于构建大规模、高可用性的企业级应用程序。它提供了一个分布式的数据存储解决方案,支持实时数据访问和处理,...
1. JMX监控:利用Java Management Extensions(JMX)监控Kafka和JVM的状态,及时发现和解决问题。 2. 性能调优实战:通过监控工具(如VisualVM、JConsole)分析JVM性能,结合Kafka的监控指标(如生产者和消费者速率...
JBoss Java Management Extensions (JMX) 是 JBoss 提供的管理工具,允许开发者监控和管理 JBoss 应用服务器中的各种服务和组件。通过 JMX,你可以远程操作和监视服务器状态,例如查看和修改配置、收集性能指标等。...