使用Spring将POJO公开为JMX MBean

这是一个非常不错的教程,介绍了如何通过我们最新的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(这是OpenDMK的一部分),以避免出现以下异常:

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。 在类路径上的jar以及对于RMI,请确保在连接器之前启动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

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

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

相关文章

mysql 5.1由于Host为localhost的用户为空,密码为空,导致本地用户无法登陆。

不说了。直接上mysql的用户数据&#xff0c;第四列里面&#xff0c;host为localhost&#xff0c;用户为空&#xff0c;密码为空。 导致在本地登陆的时候除了root的账户外&#xff0c;其他账号不需要密码即可登陆&#xff0c;并且影响host为 %的用户登陆。 这里只需要删除对应的…

scala 88 for替换map,flatmap,filtermap,for,scala,flatmap

王家林亲授《DT大数据梦工厂》大数据实战视频“Scala深入浅出实战经典”视频、音频和PPT下载&#xff01;第88讲&#xff1a;Scala中使用For表达式实现map、flatMap、filter百度云盘&#xff1a;http://pan.baidu.com/s/1mgtgcIG360云盘&#xff1a;http://yunpan.cn/cdXsbctXf…

简单阐述下OC中UIImage三种创建方式~~~

一. 直接使用imageNamed进行创建 1 UIImage * image [UIImage imageNamed:"1.jpg"]; 简单说一下这种方式的优缺点&#xff1a; 优点&#xff1a;代码量少&#xff0c;一行代码就可以搞定。当程序中多次加载这张图片时&#xff0c;系统会指向同一块内存&#xff0c;…

(一二四)tableView的多组数据展示和手动排序

最近在写一个轻量级的网络游戏&#xff0c;遇到了技能优先顺序手动排序的需求&#xff0c;我就想到了iOS自带的tableView编辑功能&#xff0c;对其进行了初步探索&#xff0c;最后做出的效果如下图所示&#xff1a; 点击左边可以删除&#xff0c;拖住右边可以手动排序&#xff…

ARC_xp_20160530

1、 申请内存的地方在哪里&#xff1f;忘了...(应该是用的 malloc) 2、 键盘上按下一个键&#xff0c;处理的函数为&#xff1a;(所在的模块 应该是“CEGUIIrrlichtRenderer.dll”) 003B465F CC INT3 003B4660 /$ 53 PUSH EBX 003B4661 |. 56 …

Hibernate映射集合性能问题

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

算法:1!+(1!+3!)+(1!+3!+5!) + ( 1! + 3! + 5! + 7! + 9!)+....+(1!+3!+5!+ ... + m!)...

-(void)touchesBegan:(nonnull NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event{ //算法入口 [self func2:9]; } //计算阶乘 factor&#xff08;m&#xff09;&#xff1d; m&#xff01; -(int)factor:(int)m{ int factorNum0; if(m0|m1) return 1; e…

知道这 20 个正则表达式,能让你少写 1,000 行代码

CocoaChina05-13正则表达式&#xff0c;一个十分古老而又强大的文本处理工具&#xff0c;仅仅用一段非常简短的表达式语句&#xff0c;便能够快速实现一个非常复杂的业务逻辑。熟练地掌握正则表达式的话&#xff0c;能够使你的开发效率得到极大的提升。下面是技匠整理的&#x…

用Jackson进行Java JSON处理

JSON &#xff08;Javascript对象符号&#xff09;正成为一种非常流行的数据交换格式。 在使用诸如YUI&#xff0c;ExtJS&#xff0c;DOJO等Javascript框架开发Web应用程序时&#xff0c;我们可以使用XML或JSON在客户端和服务器之间交换数据。 通常&#xff0c;我们从服务器获得…

Android Togglebutton 默认背景被放大

1 . 最近在项目中自定义toggleButton 发现背景图放入后 &#xff0c;比美工给我的原图要大很大 2. 为什么&#xff1f; 3.比较ToggleButton 和TextView源码 发现, toggleButton 设置了minWidth 和minHeigh &#xff0c;导致我的背景小图被拉伸。 4.解决这种问题&#xff1a; 重…

MapReduce:简单介绍

MapReduce是Google流行的一种并行编程技术。 它用于处理大量数据。 仅通过将工作并行分配给多台机器&#xff0c;就可以在合理的时间内完成这种处理。 每台机器都处理一小部分数据。 MapReduce是一种编程模型&#xff0c;使开发人员可以专注于编写处理数据的代码&#xff0c;而…

python翻译词典实例

#!/usr/bin/python # -*- coding:utf-8 -*- #通过有道翻译来进行内容翻译 import urllib2 import urllib import json #---------翻译方法定义 start---------# def transfer( transferStr , lanSource auto ): data {type:lanSource,i:transferStr,doctype:json,xmlVersion:1…

元素分类--块级元素(特点:独占一行, 宽高边距可改)

什么是块级元素&#xff1f;在html中<div>、 <p>、<h1>、<form>、<ul> 和 <li>就是块级元素。设置display:block就是将元素显示为块级元素。如下代码就是将内联元素a转换为块状元素&#xff0c;从而使a元素具有块状元素特点。 a{display:b…

Java应用程序中的消息传递主体

消息传递是每个Java应用程序的关键方面&#xff0c;尤其是对于涉及企业应用程序集成&#xff08;EAI&#xff09;或关注点分离的应用程序&#xff0c;例如多层WEB应用程序。 消息传递可以分为两个主要类别&#xff0c;即同步和异步。 另一方面&#xff0c;使用同步消息传递时&…

站立会议05(第二次冲刺)

一、站立会议信息&#xff08;配站立会议照片&#xff09; 第五天我们继续开发&#xff0c;把注册验证信息完善一下&#xff0c;将开始网站公共主页的开发。 二、任务进度 第五天我们注册验证完成。 三、任务看板&#xff08;图&#xff09; 四、燃尽图&#xff08;图&#xff…

[SoapUI] DataSource, DataSourceLoop, DataSink

Script assertion in login: 转载于:https://www.cnblogs.com/MasterMonkInTemple/p/4748189.html

1154. 一年中的第几天

给你一个字符串 date &#xff0c;按 YYYY-MM-DD 格式表示一个 现行公元纪年法 日期。请你计算并返回该日期是当年的第几天。 通常情况下&#xff0c;我们认为 1 月 1 日是每年的第 1 天&#xff0c;1 月 2 日是每年的第 2 天&#xff0c;依此类推。每个月的天数与现行公元纪年…

将CAPTCHA添加到您的GWT应用程序

什么是验证码&#xff1f; 在一个充满恶意机器人的世界中&#xff0c;您该怎么做才能保护您宝贵的Web应用程序&#xff1f; 您真正应该做的基本事情之一就是向其中添加CAPTCHA功能。 如果您不熟悉&#xff08;听起来有些奇怪&#xff09;&#xff0c;则CAPTCHA是确保用户实际上…

SQL基础语句

数据库面试常见题 一、SQL语言包括数据定义语言、数据操作语言、数据控制语言和事务控制语言1&#xff1a;DDL(Data Definition Language)&#xff0c;是用于描述数据库中要存储的现实世界实体的语言。 CREATE TABLE - 创建新表 ALTER TABLE - 变更&#xff08;改变&#xff0…

YYModel Summary

YYModel Effect-> YYModel的作用Provide some data-model method—>提供一些数据模型的方法Convert json to any object, or convert any object to json.->对任何对象转换成JSON&#xff0c;和对任何JSON转换为对象Set object properties with a key-value dictionar…