日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 监控之JMX规范1

發布時間:2023/12/31 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 监控之JMX规范1 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.??JMX規范

JMX是“Java管理擴展的”的縮寫,它和其他JavaEE類似也是曾經的Sun提出的一種規范(規約),從名字上可以看出主要是負責系統管理。是一個為系統加入或者說擴展成有管理功能的規約,只要按照這套規約行事,您的系統,某些某塊就具備被其他工具(例如JConsole)管理的能力換句話說就是可以用JMX來監控咱們的系統運行情況,還有可以在運行時環境像Web Service、RMI一樣調用系統管理類的一些方法。實現此規范的框架也很多:Spring、Tomcat、JBoss容器……,他們實現了好多可以被jsoncole 工具監控的方法

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文件內容如下
  • ?

  • <?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>??
  • ?
  • ?org.springframework.jmx.export.MBeanExporter是Spring暴露管理Bean(MBean)的核心類之一。它使用一個Map類型的屬性——beans記錄要暴露MBean的類。將咱們剛剛寫的HusbandLocal以屬性注入的方式注入進去。之后寫一個加載Spring文件的main實例,開啟服務。

    Java代碼??

  • <span?style="font-size:?small;">????????//?加載配置文件??
  • ????????ClassPathXmlApplicationContext?context?=?new?ClassPathXmlApplicationContext(??
  • ????????????????"applicationContext.xml");??
  • ??
  • ????????//?通過死循環保證主線程一直運行??
  • ????????while?(true)?{??
  • ??
  • ????????}??
  • </span>??
  • ?

    ?點擊進去后可以查看咱們剛才暴露的MBean,如下

    ?



    ?我們可以點擊MBean的操作,比如playDOTA(),后臺就調用了該方法。在這個界面還可以看到MBean的屬性值,你叫他們狀態也行。

    如此,我們完成了一個本地監控MBean對象的小功能。不過就像原來說的,這有個問題就是咱們之前說的,這種本地場景不多見,不常用。Ok,咱們看看要想遠程監控需要做些什么事情。

    4.??監控遠程程序

    下面我們嘗試在遠程監控咱們這個“丈夫”。

    首先在Spring配置文件增加以下內容

    Java代碼??

  • ? ?<!--?遠程連接?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>
  • ?剛才我們將我們的MBean注冊到一個基于RMI訪問方式的連接服務上(ConnectorServerFactoryBean),占用的端口是8080。這時啟用jconsole以遠程方式連接,不用輸入密碼,如下圖所示

    ?

    之后和在本地操作一樣,可以監控MBean的屬性狀態,也可以進行相應的操作。

    5.??監控Web容器

    如果我們要監控一下Web服務器,比如Tomcat服務器的JVM狀態怎么辦?這種場景非常的常見。其實配置也很簡單。我們打開{Tomcat_HOME}/bin/catalina.bat,在linux下是{Tomcat_HOME}/bin/catalina.sh文件。將原有的腳本

    Java代碼??

  • set?LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager</span>??
  • ?替換成為

    Java代碼??

  • 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"??
  • ?

    我們運行startup.bat文件,之后開啟JConsole,遠程登錄tomcat

    ?之后即可查看遠程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,和Tomcat一樣,需改一下配置文件run.bat,linux的就不贅述了,將以下代碼段

    Java代碼??

  • if?"x%JAVA_OPTS%"?==?"x"?(??
  • ??set?"JAVA_OPTS=-Dprogram.name=%PROGNAME%"??
  • )?else?(??
  • ??set?"JAVA_OPTS=-Dprogram.name=%PROGNAME%?%JAVA_OPTS%"??
  • )??
  • ?
  • ?

    替換成

    Java代碼??

  • 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%"??
  • )??
  • ?
  • 之后啟動JConsole即可遠程連接JBoss,地址:192.168.1.100:9999

    ?

    ?

    可以看出Tomcat與JBoss的消耗資源真的不是一個數量級的。

    7.??總結

    這次是介紹了JMX的使用場景和一些分布式系統中常用的配置和監控情形,對于JMX規范本身,尤其是重要的MBean并沒有做過多的介紹,其實MBean有很多種情況,這一篇文章并不能盡述。知道他是干什么,遇到那些晦澀難懂的理論就不再懼怕了,有時間打算下次再詳細說說JMX MBean的各種使用情況。

    總結

    以上是生活随笔為你收集整理的java 监控之JMX规范1的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。