从零开始玩转JMX(二)——Condition
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。
歡迎跳轉到本文的原文鏈接:https://honeypps.com/java/jmx-quick-start-2-condition/
Notification
一個MBean提供的管理接口允許代理對其管理資源進行控制和配置。然而,對管理復雜的分布式系統來說,這些接口知識提供了一部分功能。通常,管理應用程序需要對狀態變化或者當特別情況發生變化時作出反映。Notification起到了MBean之間的溝通橋梁的作用。JMX Notification模型和Java Event模型類似,將一些重要的信息,狀態的轉變,數據的變更傳遞給Notification Listener,以便資源的管理。
通知模型僅僅涉及了在同一個JMX代理中的管理構件之間的事件傳播。JMX通知模型依靠以下幾個部分:
發送一個通用類型的通知,任何一個監聽者都會得到該通知。因此,監聽者需提供過濾器來選擇所需要接受的通知。任何類型的MBean,標準的或動態的,都可以作為一個通知發送者,也可以作為一個通知監聽者,或兩者都是。
這里采用一個案例來說明,前面的Hello中有一個printHello(String whoName)方法,意思根據碰到的是誰來打招呼,比如:
小廝從對面走來,說:“hi”。我們回之以禮,說:“Hello, Xiaosi”.
首先這里需要小廝先說一個“hi”(相應一個操作方法),然后他說的話封裝成了聲波(Notification的消息包)傳遞出去。然后我們要給Hello類裝上一個監聽器(NotificationListener),這個監聽器將捕捉到小廝的Notification消息包,然后回復說:“Hello, Xiaosi”.
引入新的類XiaoSi.java和XiaosiMBean:
package com.test.jmx.notification;import javax.management.Notification; import javax.management.NotificationBroadcasterSupport;public class XiaoSi extends NotificationBroadcasterSupport implements XiaoSiMBean {private int seq = 0;/** 必需繼承NotificationBroadcasterSupport* 此類只有一個hi方法,方法只有兩句:創建一個Notification消息包,然后將包發出去* 如果你還要在消息包上附加其他數據,Notification還有一個setUserData方法可供使用*/@Overridepublic void hi() {Notification n = new Notification(//創建一個信息包"xiaosi.hi",//給這個Notification起個名稱this,//由誰發出的Notification++seq,//一系列通知中的序列號,可以設置任意數值System.currentTimeMillis(),//發出時間"Xiaosi"//發出信息的消息文本);sendNotification(n);} } package com.test.jmx.notification;public interface XiaoSiMBean {public void hi(); }接下去創建Hello類的Listener(HelloListener.java),用于監聽Notification的消息包并處理。
package com.test.jmx.notification;import com.test.jmx.Hello;import javax.management.Notification; import javax.management.NotificationListener;public class HelloListener implements NotificationListener {@Overridepublic void handleNotification(Notification notification, Object handback) {System.out.println("----------HelloListener-Begin------------");System.out.println("\ttype = "+ notification.getType());System.out.println("\tsource = "+notification.getSource());System.out.println("\tseq = "+notification.getSequenceNumber());System.out.println("\tsend time = "+notification.getTimeStamp());System.out.println("\tmessage="+notification.getMessage());System.out.println("----------HelloListener-End------------");if (handback != null) {if (handback instanceof Hello) {Hello hello = (Hello)handback;hello.printHello(notification.getMessage());}}} }修改HelloAgent的代碼:
package com.test.jmx.notification;import com.sun.jdmk.comm.HtmlAdaptorServer; import com.test.jmx.Hello;import javax.management.*; import java.lang.management.ManagementFactory;public class HelloAgent {public static void main(String[] args) throws MalformedObjectNameException, NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanRegistrationException {MBeanServer server = ManagementFactory.getPlatformMBeanServer();ObjectName helloName = new ObjectName("MyMBean:name=HelloWorld");Hello hello = new Hello();server.registerMBean(hello,helloName);ObjectName adapterName = new ObjectName("MyBean:name=htmladapter,port=8082");HtmlAdaptorServer adapter = new HtmlAdaptorServer();server.registerMBean(adapter,adapterName);XiaoSi xs = new XiaoSi();server.registerMBean(xs,new ObjectName("MyMBean:name=xiaosi"));xs.addNotificationListener(new HelloListener(),null,hello);adapter.start();} }運行HelloAgent,然后在瀏覽器中輸入localhost:8080, 點擊“name=xiaosi”:
進入頁面:
點擊“hi”按鈕,此時控制臺打印:
----------HelloListener-Begin------------type = xiaosi.hisource = com.test.jmx.notification.XiaoSi@12f7757cseq = 1send time = 1476184927551message=Xiaosi ----------HelloListener-End------------ Hello, Xiaosi參考資料
歡迎跳轉到本文的原文鏈接:https://honeypps.com/java/jmx-quick-start-2-condition/
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。
總結
以上是生活随笔為你收集整理的从零开始玩转JMX(二)——Condition的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库相关中间件收录集
- 下一篇: 从零开始玩转JMX(三)——Model