`
annegu
  • 浏览: 98718 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论
阅读更多
最近工作中用到了JMX,遇到了一些问题,正好记录一下。
spring的jmx配置文件就是参考文档的,见最后。

稍稍说明三点:
(1) Registry bean用来注册一个rmi的连接器,告知开启的端口号。
(2) ServerConnector用来构建服务器端的连接,这里用的是iiop的连接方式。objectName和serviceUrl要匹配。
(3) Assembler配置了对外暴露的mbean,这里就是把mbeanName这个接口的方法都暴露出去。

在使用的过程中,我碰到了一些问题和疑问,总结如下:
1、 本机启动应用之后,发现jmx端口没有打开,可是用jconsole连接serviceUrl的服务,却可以连接的上?

因为这个时候serviceUrl就是本机地址127.0.0.1的,这个通信连接是本机进程之间的通信。进程间的通信(Interprocess Communication)有多种方式,主要有以下几种:
◎ 文件映射:一个进程建立一个文件映射对象,写入数据,另一个进程从中取出数据,也就是这两个进程共享了文件中的数据。
◎ 共享内存:与文件映射类似,一个进程把数据写入内存,另一个进程从内存中取出数据。
◎ 管道:两个进程之间的有序通道。
◎ 套接字(socket):网络应用大多使用它。

所以尽管我连接的是“service:jmx:iiop://10.13.37.62:9099/”(10.13.37.62是本机IP),但其实并不是通过socket来通信的,估计是通过共享内存或者文件映射来通信的,具体实现我并不清楚。所以,这个时候,jmx的端口并没有开启。
加上registry bean的配置之后,可以看到JMX的端口9099端口就可以打开了。
所以,不要以为本地可以连接就OK了啊~~


2、 RMI-IIOP是什么?

在RMI-IIOP出现之前,分布式程序设计只有两种选择,RMI和CORBA。RMI就是远程方法调用,仅用于java对java的分布式远程调用,所以RMI对java开发者而言相当透明而且易于实现,而CORBA是面向对象的分布式系统的建立标准,对语言独立,接口采用了非常通用的标准。RMI-IIOP结合了RMI的简单和CORBA的多语言的优点。
我这次用的是iiop,如果要指定其他URL或者要用 MBeanServer 注册 JMXConnectorServer, 要使用相应的 serviceUrl 和 ObjectName 属性。


3、 关于远程调用的参数调用

讲到这里,我顺便把Java中的传值调用好好写写。
Java中,如果传递的是基本数据类型(如int, double, char等)的参数的话,实际传入方法内部的是输入参数的一个拷贝,这个拷贝进入方法之后就作为局部变量,所有在方法内部的操作都是针对这个局部变量来进行的,方法结束之后,这个局部变量就完成了使命。所以在方法内部改变参数的值,并不会对输入的参数造成影响。这也就是为什么像下面的swap方法不起作用的原因。

public static void main(String[] args) {
	int i = 2;
	int j = 3;
	swap(i,j);
	System.out.println("i===" + i);
	System.out.println("j===" + j);
}
	
private static void swap(int pram1, int pram2) {
	int temp = pram2;
	pram2 = pram1;
	pram1 = temp;
}

输出结果:
i===2
j===3


如果参数是对象的话,传递的是这个对象引用的一个copy。一个对象在建立的时候,会创建一个指向这个对象的引用a。如下图所示:

当把这个对象作为参数传递给方法的时候,会重新拷贝一个对象的引用b,这个时候,引用a和b都指向了同一个对象。所以,尽管方面里面的局部变量b与实际创建对象时候的a并不是同一个引用,但是它们指向的都是同一个对象。在方法里修改b的属性的时候,其实也就是修改b指向的对象的属性。

举例:
public static void main(String[] args) {
	TestClass a = new TestClass();
	a.setClassName("class a");
	System.out.println("before changeClassName======className is " + a.getClassName());
	changeClassName(a, "class b");
	System.out.println("after changeClassName======className is " + a.getClassName());	
} 
	
private static void changeClassName(TestClass object, String className) {
	bject.setClassName(className);
} 

class TestClass{
	private String className;

	public String getClassName() {
		return className;
	}

	public void setClassName(String className) {
		this.className = className;
	}
}

上面代码的执行结果为:
before changeClassName======className is class a
after changeClassName======className is class b


对于远程调用来说,大体上的规则还是一样的,只是因为数据要在client和server端进行传输,所以要把参数序列化与反序列化。
比如,本地为客户端client,要调用server端的userService.changeUserName(User user)这个方法,我在client上新建了一个user,现在这个user是client上的一个对象,然后通过RMI来调用远程方法changeUserName(user),那么就需要把user这个对象序列化,传递给server,然后在server端反序列化user,创建一个User对象,做相应的修改操作之后,再把server端的这个user对象序列化了传回client。最后,client反序列化server传递过来的user对象,再修改client本地的对应的user对象。所以,修改user name的操作就是在服务器上做的。

最后,附上spring的jmx配置文件:
<bean id="registry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean">	<property name="port" value="9099"></property>
</bean> 
<bean id="mbeanName"  class="com.***.jmx.***MBeanImpl">
	<constructor-arg value="9099" />
</bean>
<bean id="assembler" class="org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssembler">   
	<property name="managedInterfaces">
		<value>com.***.jmx.***MBean</value>
        </property>
</bean>
<bean id="namingStrategy" class="org.springframework.jmx.export.naming.KeyNamingStrategy" >
</bean>	
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"  lazy-init="false">
	<property name="beans">
		<map>
			<entry key="bean:name=***Bean" value-ref="mbeanName"/>
		</map>
	</property>
	<property name="server" ref="mbeanServer"/>
	<property name="autodetect" value="false"/>
	<property name="assembler" ref="assembler" />
	<property name="namingStrategy" ref="namingStrategy"/>
</bean>
<bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean">
</bean>
<!-- Expose JMX over RMI -->
<bean id="serverConnector" class="com.***.jmx.ConnectorServerFactoryBean" depends-on="registry">
	<property name="objectName" value="connector:name=iiop" />
	<property name="server" ref="mbeanServer"/>
	<property name="serviceUrl" value="service:jmx:iiop://localhost:9099" />
</bean>
  • 大小: 3.2 KB
  • 大小: 3.9 KB
2
0
分享到:
评论
4 楼 ychen_123 2012-09-11  
我想咨询你一个关于JMX的问题。
  就是启动一个程序。
配置了-Dcom.sun.management.jmxremote.port=8310
但是除了这个端口还开了2个监听端口这是怎么回事呢?能告诉我这2个端口的作用吗?
java       monitor  chenlei   16u  IPv4 204567012       TCP *:53319 (LISTEN)
java       monitor  chenlei   18u  IPv4 204567019       TCP *:8310 (LISTEN)JMX端口
java       monitor  chenlei   19u  IPv4 204567059       TCP *:57629 (LISTEN)
3 楼 moshalanye 2009-12-21  
哦  淘宝? 不错!女孩子有这样的强度不容易列!
阿里果然有很多人才列,上次在 javaeye 看到一个阿里的强人!
检索的知识很扎实,把 DAT 也实现了。

2 楼 annegu 2009-12-16  
tb  
1 楼 moshalanye 2009-12-15  
妹妹能力不俗!知识体系不错列!~

JMX这个j2ee规范你很熟悉?我这块都没涉猎,等过段时间看下。

iiop 是通信协议(提供统一的数据通信格式,用于跨语言,这点不多说了,类比的话和soap一个道理,rmi原来使用的是java的数据格式)

iiop 是GIOP协议与tcp绑定的实现


很想知道妹妹在哪个公司了?

相关推荐

    JMX实战 JMX开发

    书中不仅有对于基础知识的介绍,还有对于JMX开发中重大的体系架构问题的深入探讨,总结了大量JMX开发中的设计模式,并讨论了框架、安全性与性能等等。书中提供了几个典型的例子,兼顾各种开发平台,这些例子的代码...

    论文研究-基于JMX的网络管理系统.pdf

    简单介绍了JMX规范,在此基础上,讨论了使用JMX体系结构建立网络管理程序的一般方法,最后结合JMX规范和实现方法,分析基于JMX网络管理系统的优势。

    JBoss JMX实现架构

    JBoss 3.x实现了一种新的类装载架构,即允许类跨部署单元使用。本文在深入讨论具体的JBoss类装载模型之前,将给出Java的类型系统特性及类装载器介绍。

    embedded-jmxtrans:进行中的JMX指标导出器

    如果您有什么要讨论的 入门 启用了Spring Framework的Web应用程序的入门指南。 玛文 添加embedded-jmxtrans依赖项 &lt; groupId&gt;org.jmxtrans.embedded &lt; artifactId&gt;embedded-jmxtrans &lt; version&gt;1.0.12&lt;/ ...

    JMX动态管理服务的研究与设计* (2002年)

    在JMX规范1.0的基础上,分析了JMX的技术背景及其体系结构,提出了一种MBean对象的实现方法和Java管理服务核心模块的设计模式。讨论了远程管理通信接口以及基于Java事件模型Notification机制的设计,并对标准管理...

    weblogic内存调优

    JVM内存的调优 1. Heap设定与垃圾回收Java Heap分为3个区,Young,Old和...Permanent区则负责保存反射对象,本文不讨论该区。JVM的Heap分配可以使用-X参数设定, -Xms 初始Heap大小 -Xmx java heap最大值 …… ……

    高级java2大学教程 源代码

    讨论了分布式编程,其中包括RMI、Jini、Jiro、JMX、CORBA以及JavaSpace的相关概念;介绍了有关网络服务的内容,并通过实例讲解了servlet和JSP的应用,然后列举了与其他Web服务相关的技术,例如WML、SOAP等。本书还...

    JBOSS架构分析.doc

    JBoss使用工业标准的JMX来管理, JBoss组件和为EJB提供服务。基于我们以前的开发经验,我们发现了不同的J2EE应用服务器间的存在着巨大的性能和可扩展性差异。我们相信架构的设计是决定类似于性能和可扩展性等质量...

    SpringBoot实战(第4版)清晰版.zip

    《Spring Boot实战》全书分为8章。...你还会看到如何使用Actuator的Web端点、远程shell和JMX MBean对应用程序一窥究竟。 第8章讨论了各种部署Spring Boot应用程序的方法,包括传统的应用程序服务器部署和云部署。

    vjtools:vip.com的Java编码标准,库和工具

    主力于Java的唯品会,关于Java的一些小家底。 各位看官看着是好的,烦请“ Star”。 -2018.9.24 Java标准 项目 描述 唯品会Java开发手册 IDE格式化模板 声纳规则定制示例 Java核心库 项目 描述 关于文本,集合,...

    spring boot 实战,springboot实战项目,Java

    4? 第1章会对Spring Boot进行概述,内容涵盖最基本的自动配置、起步依赖、命令行界面和Actuator。? 第2章会进一步深入... 第8章讨论了各种部署Spring Boot应用程序的方法,包括传统的应用程序服务器部署和云部署。

    SpringBoot实战第4版清晰版

    《Spring Boot实战》全书分为8章。  第1章会对Spring Boot进行概述,内容涵盖最基本的自动配置、起步依赖、命令行界面... 第8章讨论了各种部署Spring Boot应用程序的方法,包括传统的应用程序服务器部署和云 部署。

    学习软件相互了解

    各位大家学习一下,相互了解一下,大家可以交流一下,交个朋友认识一下

    JiveJdon v4.6.1.zip

    2011年jivejdon 4.4的测试样本(Jmeter可打开):jivejdon.jmx 结果:聚合报告.jmx其最新测试结果如下,由于将数据库等操作使用异步事件实现,回帖和帖子修改等写入性操作都是基于内存领域对象实现,性能大大提高: ...

    jmxtrans:jmxtrans

    实际上,这是缺少通过一端通过JMX与JVM对话以及可以在另一端实现的任何日志记录/监视/图形包之间的连接器。 jmxtrans是一个非常强大的工具,它使用易于生成的基于JSON(或 )的配置文件,然后以所需的任何格式输出...

    基于Java的分布式缓存优化在网络管理系统中的应用

    讨论建立在JMX管理框架上的网络性能管理系统的优化方案,利用JMX体系结构的可扩展特性,在系统的服务器端嵌入了分布式缓存系统对服务器端的缓存进行高效分布式的管理,提高了原系统的稳定性与运行效率。

    Hbase+Spring boot实战分布式文件存储

    实战开发通过jmx获取HBase运行时数据,监控集群状态 5-1 HBase备份与恢复 5-2 HBase监控简介 5-3 Hadoop JMX监控实战 5-4 HBase JMX监控实战 第6章 Phoenix & Sqoop 对HBase业务应用过程中常用到的第三方开源工具...

Global site tag (gtag.js) - Google Analytics