使用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.pswp.cn/news/374614.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374614.shtml
英文地址,請注明出處:http://en.pswp.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…