spring pojo_使用Spring将POJO公开为JMX MBean

spring pojo

这是一个非常不错的教程,介绍了如何通过我们最新的JCG合作伙伴 “ The Holy Java ”博客(很酷的名字)实现“ 用Spring轻松将POJO作为JMX MBean公开 ”。

(注意:对原始帖子进行了少量编辑以提高可读性)

Java管理扩展(JMX)技术是一种检查或更改变量状态或通过(例如) JConsole之类的管理GUI在(远程)运行的应用程序中调用方法的好方法。 Spring使在几分钟之内仅用很少的配置就可以将任何POJO公开为JMX MBean变得微不足道。 Spring JMX文档非常好,但是有一段时间我一直在挣扎,因此想在这里记录正确的解决方案。

我需要在服务器上运行的IBM JVM 1.5上使用Spring 2.5监视命令行Java应用程序。 监视将在Sun JVM 1.6上使用jconsole作为PC上的JMX客户端执行。 以下所有XML代码段均来自相应的Spring application-context.xml。

将POJO变成MBean

JMX可以公开以原语或复杂数据类型为参数的getter,setter和操作(尽管除少数特殊类型外,其他类型都要求客户端具有类)。 您告诉Spring将POJO公开为MBean,如下所示:

<bean id="myMBean"class="my.package.JobPerformanceStats"factory-method="instance" /><bean class="org.springframework.jmx.export.MBeanExporter" lazy-init="false"><property name="beans"><map><entry key="bean:name=MyMBeanName" value-ref="myMBean"/></map></property>
</bean>

首先,您声明POJO类的实例– myMBean(出于其他原因,我使用老式的单例,并使用JobPerformanceStats.instance()访问Bean)。 接下来,使用lazy-init =“ false”声明一个MBeanExporter并向其介绍您的bean。 (还有其他方法可以执行此操作,包括自动发现。)然后,该bean将在其键下可见,即“ bean:name = MyMBeanName”,JConsole将其显示为“ MyMBeanName”。

注意,由于MBeanExporter使用新的java.lang.management包,因此它仅在JVM 1.5+下工作。 在JDK 1.4下,Spring会因以下错误而失败:

java.lang.NoClassDefFoundError:javax / management / MBeanServerFactory
在org.springframework.jmx.support.MBeanServerFactoryBean.createMBeanServer

默认情况下,它将公开所有公共方法和属性。 您可以通过多种方式进行更改,例如在界面的帮助下。

如果不是在已经提供MBean服务器的容器中运行(在这里就是我的情况),则必须告诉Spring启动一个容器:

<bean class="org.springframework.jmx.support.MBeanServerFactoryBean"/>

启用远程访问

要使MBean可从另一台机器访问,必须通过声明配置有适当通信机制的ConnectorServerFactoryBean将其公开。

通过JMXMP进行远程访问

默认情况下, ConnectorServerFactoryBean通过JMX消息传递协议(JMXMP)使用地址公开MBean。

服务:jmx:jmxmp:// localhost:9875

<bean class="org.springframework.jmx.support.ConnectorServerFactoryBean" />

但是,现成的协议不支持此协议,因此必须在MBean应用程序和jconsole客户端的类路径上都包括OpenDMK的一部分jmxremote_optional.jar 。

org.springframework.beans.factory.BeanCreationException:创建名称为'org.springframework.jmx.support.ConnectorServerFactoryBean#0的bean时出错? 在类路径资源[application-context.xml]中定义:初始化方法的调用失败; 嵌套的异常是java.net.MalformedURLException:不支持的协议:jmxmp

通过RMI进行远程访问

或者,您可以通过RMI公开MBean,它没有其他依赖性:

<!--
Now expose the server for remote access via RMI
Local access:   service:jmx:rmi://localhost/jndi/rmi://localhost:10099/myconnector
Remote access:  service:jmx:rmi:///jndi/rmi://your.host:10099/myconnector
or service:jmx:rmi://localhost/jndi/rmi://localhost:10099/myconnector
-->
<beanclass="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:10099/myconnector" />
</bean><bean id="rmiRegistry"class="org.springframework.remoting.rmi.RmiRegistryFactoryBean"><property name="port" value="10099" />
</bean>

但是,还必须避免一些陷阱:

1.必须启动RMI注册表,以便连接器可以在此处注册MBean。 它不会为你开始
2.您必须确保在连接器尝试使用之前启动注册表,方法是在连接器之前声明它,或者通过使用depends-on属性将该依赖关系明确化

如果未正确设置,则会出现如下异常:

org.springframework.beans.factory.BeanCreationException:创建名称为'org.springframework.jmx.support.ConnectorServerFactoryBean#0的bean时出错? 在类路径资源[application-context.xml]中定义:初始化方法的调用失败; 嵌套异常是java.io.IOException:无法绑定到URL [rmi:// localhost:10099 / jmxrmi]:javax.naming.ServiceUnavailableException [根本异常是java.rmi.ConnectException:连接被拒绝托管给主机:localhost; 嵌套的异常是:java.net.ConnectException:拒绝连接:connect]。

通过SSH隧道访问的本地MBean服务器

为了提高安全性,您可能希望不要通过仅从本地计算机(127.0.0.1)访问MBean并使用SSH隧道使MBean暴露给远程访问,以便远程JConsole可以将它们作为本地应用程序进行访问。 这当然是可能的,但可能会很困难,因为通常JMX会通过RMI进行访问,RMI 使用两个端口 :一个用于RMI Registry,另一个用于实际服务(此处为MBean服务器),通常在运行时随机选择,而您d需要同时隧穿。 幸运的是, Spring使配置两个端口成为可能 :

<beanclass="org.springframework.jmx.support.ConnectorServerFactoryBean"depends-on="rmiRegistry"><property name="objectName" value="connector:name=rmi" /><property name="serviceUrl"value="service:jmx:rmi://127.0.0.1:STUBPORT/jndi/rmi://localhost:REGISTRYPORT/myconnector" />
</bean><bean id="rmiRegistry"class="org.springframework.remoting.rmi.RmiRegistryFactoryBean"><property name="port" value="REGISTRYPORT" />
</bean>

将STUBPORT和REGISTRYPORT替换为合适的编号,然后隧道传输这两个编号。 请注意,连接器的serviceUrl和RMI注册表的端口属性中的REGISTRYPORT号相同。
警告:上面的配置实际上并不能阻止从远程应用程序直接访问。 为了真正强制RMI注册表仅侦听来自本地主机的连接,我们可能需要在不带Spring的Sun JVM下设置系统属性com.sun.management.jmxremote。 另外,要强制注册表使用IP 120.0.0.1,我们需要设置java.rmi.server.hostname = localhost(也适用于Spring)。 请参阅有关强制本地访问的讨论 。 我不确定如何使用Spring获得相同的结果,同时仍然保留指定两个RMI端口的功能。 还要检查Spring RmiServiceExporter的JavaDoc。

相关文章和文档:

  • Alfresco的隧道调试和JMX (A。使用Spring)-请参阅第二部分,JMX的SSH隧道
  • 自定义隧道RMI代理 –使用配置的端口而不是随机端口
  • 使用SSH上的JMX监视ActiveMQ
  • JMX 1.2规范和JMX 1.2远程API规范 ; 来自JMX规范:“ MBean服务器依赖于协议适配器和连接器,以使代理可以从代理JVM之外的管理应用程序访问代理。” 另一方面, Oracle JMX页面显示,如果您设置com.sun.management.jmxremote(而不是…jmxremote.port),则可以“监视本地Java平台,即在JVM上运行”。同一台机器” –因此不一定来自同一JVM。

与Jconsole连接

启动JConsole并键入适当的远程地址,例如

服务:jmx:rmi:/// jndi / rmi://your.server.com:10099 / myconnector

如果连接到远程计算机上的应用程序,则可以通过RMI访问your.server.com。

关于连接URL,如果您有一个连接器,其serviceUrl为

服务:jmx:rmi:// myhost:9999 / jndi / rmi:// localhost:10099 / myconnector

然后,可以从客户使用

服务:jmx:rmi:// myhost:9999 / jndi / rmi://your.server.com:10099 / myconnector

或简单地

服务:jmx:rmi:/// jndi / rmi://your.server.com:10099 / myconnector

因为,根据JMX 1.2远程API规范(第90页):

…主机名和端口号
#(示例中为myhost:9999)不被客户端使用,如果
#目前,基本上是评论。 连接器服务器地址
#实际上存储在序列化的存根(/ stub /形式)或
#目录条目(/ jndi /格式)。

IBM JVM,JConsole和JMX配置

IBM JVM 5 SDK指南指出IBM SDK也包含JConsole并识别与JMX相关的相同系统属性 ,即com.sun.management.jmxremote。*(尽管未提及“ com.sun.management.jmxremote”本身)。 )。
请注意,IBM JConsole有所不同,例如,它缺少“本地”选项卡,该选项卡由指定命令行选项connection = localhost代替(在SDK指南中搜索“ JConsole监视工具的本地选项卡”)。

进一步改进

JVM 1.5:公开MemoryMXBean

从Java 5.0开始,有几个有用的平台MBean提供有关JVM的信息,包括java.lang.management.MemoryMXBean,它使您可以查看堆使用情况,调用GC等。

您可以按如下所示将其提供给JConsole和其他JMX代理使用(尽管必须有更简单的方法):

<bean class="org.springframework.jmx.export.MBeanExporter" lazy-init="false"><property name="beans"><map><entry key="bean:name=Memory2" value-ref="memProxy"/><!-- other exported beans may follow ... --></map></property>
</bean><bean id="memProxy"class="java.lang.management.ManagementFactory"factory-method="getMemoryMXBean"/>

更新:通过使用工厂方法getPlatformMBeanServer将Spring的MBeanServerFactoryBean替换为java.lang.management.ManagementFactory,似乎确实存在直接暴露平台MBean的更好的方法。 当然,这需要JVM 1.5+。

通过密码验证提高安全性

通过RMI访问MBean可能受密码保护。 根据讨论, 在服务器连接器上配置了身份验证 :

<beanclass="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:10099/myconnector" /><property name="environment"><!-- the following is only valid when the sun jmx implementation is used --><map><entry key="jmx.remote.x.password.file" value="etc/security/jmxremote.password"/><entry key="jmx.remote.x.access.file" value="etc/security/jmxremote.access"/></map></property>
</bean>

passwd和access文件遵循可在JDK / jre / lib / management文件夹中找到的模板。

摘要

使用Spring将POJO作为MBean公开很容易,只是不要忘记启动MBean服务器和连接器。 对于JMXMP,请包括jmxmp_impl。 对于RMI,请确保在类路径上添加jar,并确保在连接器之前启动RMI注册表。

相关文章:

  • JBoss 4.2.x Spring 3 JPA Hibernate教程
  • GWT EJB3 Maven JBoss 5.1集成教程
  • 调试生产服务器– Eclipse和JBoss展示

翻译自: https://www.javacodegeeks.com/2011/02/expose-pojo-jmx-mbean-spring.html

spring pojo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359518.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android地图实时标记

问题描述我在用百度地图给上边做标注的时候&#xff0c;用了一下主要代码&#xff1a;class MyOverlayItem extends ItemizedOverlay<OverlayItem>{ private ArrayList<OverlayItem> mOverlayList new ArrayList<OverlayItem>();private double mLat1 34.0…

tongweb通过控制台简单设置确认相关常用参数

1.环境版本 jdk&#xff0c;tongweb版本确认是否正确 2.检查tongweb的 license是不是永久版本&#xff0c;试用期版本到期会停止服务。 3 JVM运行编码配置-根据系统需要配置 3.1-Dfile.encodingUTF-8 编码根据系统需要配置 4. tongweb运行内存大小--根据系统需要配置 4.1一般 …

编译原理--LL(1)分析法实验C++

一、实验项目要求 1.实验目的 根据某一文法编制调试LL&#xff08;1&#xff09;分析程序&#xff0c;以便对任意输入的符号串进行分析。本次实验的目的主要是加深对预测分析LL&#xff08;1&#xff09;分析法的理解。 2.实验要求 对下列文法&#xff0c;用LL&#xff08;…

实际中进行GC调整

调优垃圾回收与任何其他性能调优活动没有什么不同。 您需要确保了解当前的情况和期望的结果&#xff0c;而不是因为对应用程序的随机部分进行调整而产生了诱惑。 通常&#xff0c;只需执行以下过程即可&#xff1a; 陈述您的绩效目标 运行测试 测量 与目标比较 进行更改并…

达梦数据库出现卡慢简单分析点

1.检查是否有锁表 查询锁表&#xff1a;select sess_id,sql_text from v$sessions sess,v$lock lck where sess.trx_idlck.trx_id and lck.blocked1; --查询僵死会话 解锁&#xff1a;根据会话ID&#xff0c;停止会话 sp_close_session(sess_id); 2.根据v$sessions,V$L…

对象的属性

首先要理解的是“实例变量”。 我们在__init__方法中并不是创建了实例变量&#xff0c;我们是添加了一个或者多个属性给实际的对象 在__init__内部 self.x 5和外部 f.x 5没有什么不同。 那么类呢&#xff1f; 1 >>> class Bar(object): 2 pass 3 4 >>>…

hibernate.session.get()方法不能获取表中最新数据解决方式样例

1.A a (A)session.get(A.class, id); sess.createSQLQuery("update A set name where id ").executeUpdate(); A a1 (A)session.get(A.class, id);//a1中获取不到修改后的name值 sess.refresh(a1);//刷新a1对象&#xff0c;取出数据库数据 注&#xff1a;hibern…

hibernate 映射_Hibernate映射集合性能问题

hibernate 映射首先&#xff0c;本文的灵感来自于Burt Beckwith在2011年1月27日于SpringOne 2GX上发表的有关高级GORM –性能&#xff0c;自定义和监视的演讲 。 简而言之&#xff0c; Burt Beckwith讨论了使用映射集合和GORM中的Hibernate 2级缓存的潜在性能问题&#xff0c;以…

SEL selector (二)

SEL消息机制工作原理是什么 引用下面文章&#xff1a; 我们在之前有提到,一个类就像一个 C 结构.NSObject 声明了一个成员变量: isa. 由于 NSObject 是所有类的根类,所以所有的对象都会有一个 isa 的成员变量[公共继承].而该 isa 变量指向该对象的类(图3.15)[类在Objective-C中…

Ext grid 根据行号获取行数据

var storeExt.getCmp(grid_id).store;// var storerowstore.getAt(row_num);//行数据 var phonenumberstorerow.get(phonenumber);//列信息 //------------------------------------------------------------------------- var dataExt.getCmp(grid_id).store.data; var d…

mobile cpu上禁用alpha test的相关总结

因为&#xff0c;每家芯片的特性不同&#xff0c;根据向framebuffer写法的不同&#xff0c;分为tile-based的mobile cpu&#xff0c;如ImgTec PowerVR&#xff0c;ARM Mali&#xff0c;一部分老版本Qualcomm Adreno。还有标准的direct&#xff08;immediate&#xff09;的mobil…

学习笔记_jquery(js)遍历页面标签

$(#selectTable tr).each(function(i){ // 遍历 tr $(this).children(td).each(function(j){ // 遍历td var id $(this).context.id; }); }); //---------------------- $("input[namename1]").each(function(){ //遍历name…

简易分享功能(非第三方)

在做一个新项目时&#xff0c;需要一个新浪和微信的分享功能&#xff0c;起初看到这个需求&#xff0c;感觉没有什么&#xff0c;直接使用第三方比较成熟的分享组件就可以的&#xff0c;比如&#xff1a;jiathis、百度分享组件&#xff0c;这些都可以很轻松并且方便的完成所需要…

达梦定时迁移数据

1. 生成迁移源代码 1.1 启动DM迁移工具&#xff08;bin/dts.exe&#xff09; 1.2 右击迁移管理空白处 -> 新建工程 1.3 展开工程 -> 右击迁移&#xff0c;新建迁移 -> 输入迁移名称&#xff0c;确认 1.4 右击迁移名称&#xff0c;打开 -> 输入源数据库连接信息&…

JSP教程–最终指南

编者注&#xff1a; JavaServer Pages&#xff08;JSP&#xff09;技术使您可以轻松创建同时包含静态和动态组件的Web内容。 JSP技术提供了Java Servlet技术的所有动态功能&#xff0c;但提供了一种更自然的方法来创建静态内容。 JSP技术的主要功能包括用于开发JSP页面的语言&…

CRC校验(转)

CRC即循环冗余校验码&#xff08;Cyclic Redundancy Check[1] &#xff09;&#xff1a;是数据通信领域中最常用的一种差错校验码&#xff0c;其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查&#xff08;CRC&#xff09;是一种数据传输检错功能&#xff0c;对数据…

tongweb6数据源使用中时常报空异常处理方式

1.在tongweb控制台 -> jdbc配置中设置数据源参数 1.1 勾选空闲超时&#xff0c;时间默认 1.2 勾选泄露超时时间 &#xff0c;时间为半天&#xff08;14400&#xff09; 1.3 勾选连接有效性检查、创建连接验证、获取连接验证、归还连接验证 图中设置泄露超时时间为900…

Ios tab Bar 使用方法

http://blog.sina.com.cn/s/blog_63578f140100w56m.html UITabBar* tabBar [[UITabBar alloc] initWithFrame:CGRectMake(40,0.0,240,30)]; [mainView addSubview:tabBar]; [tabBar release]; UITabBarItem *tabBarItem1 [[UITabBarItem alloc] initWithTitle:"排队人数…

spring smtp_使用Spring使用Java发送电子邮件– GMail SMTP服务器示例

spring smtp对于使用Java发送电子邮件&#xff0c; JavaMail API是标准解决方案。 如官方网页所述&#xff0c;“ JavaMail API提供了独立于平台和协议的框架来构建邮件和消息传递应用程序”。 必需的类包含在JavaEE平台中&#xff0c;但是要在独立的JavaSE应用程序中使用它&am…

关闭uboot MMU 会导致android2.3 S5pv210 系统不稳定?!why

问题描述在uboot里面屏蔽了MMU 使能//#define CONFIG_ENABLE_MMU就导致android 2.3 在S5pv210 上不稳定了&#xff0c;如果没屏蔽就稳定很多&#xff0c;why&#xff1f;&#xff01;坑爹的人啊&#xff0c;问了一些做了几年linux和android的人说没影响的&#xff0c;啥玩意啊&…