1. 程式人生 > >從零開始玩轉JMX(二)——Condition

從零開始玩轉JMX(二)——Condition

Notification

一個MBean提供的管理介面允許代理對其管理資源進行控制和配置。然而,對管理複雜的分散式系統來說,這些介面知識提供了一部分功能。通常,管理應用程式需要對狀態變化或者當特別情況發生變化時作出反映。Notification起到了MBean之間的溝通橋樑的作用。JMX Notification模型和Java Event模型類似,將一些重要的資訊,狀態的轉變,資料的變更傳遞給Notification Listener,以便資源的管理。
通知模型僅僅涉及了在同一個JMX代理中的管理構件之間的事件傳播。JMX通知模型依靠以下幾個部分:

  1. Notification,一個通用的事件型別,該類標識事件的型別,可以被直接使用,也可以根據傳遞的事件的需要而被擴充套件。
  2. NotificationListener介面,接受通知的物件需實現此介面。
  3. NotificationFilter介面,作為通知過濾器的物件需實現此介面,為通知監聽者提供了一個過濾通知的過濾器。
  4. NotificationBroadcaster介面,通知傳送者需實現此介面,該介面允許希望得到通知的監聽者註冊。

傳送一個通用型別的通知,任何一個監聽者都會得到該通知。因此,監聽者需提供過濾器來選擇所需要接受的通知。任何型別的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方法可供使用 */ @Override public 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 {
    @Override
    public 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.hi
source = [email protected]
seq = 1
send time = 1476184927551
message=Xiaosi
———-HelloListener-End————
Hello, Xiaosi

參考資料

歡迎支援《RabbitMQ實戰指南》以及關注微信公眾號:朱小廝的部落格。

相關推薦

開始JMX()——Condition

Notification 一個MBean提供的管理介面允許代理對其管理資源進行控制和配置。然而,對管理複雜的分散式系統來說,這些介面知識提供了一部分功能。通常,管理應用程式需要對狀態變化或者當特別情況發生變化時作出反映。Notification起到了MBean

開始JMX(一)——簡介和Standard MBean

pos cor csdn comm art order clas post tex 從零開始玩轉JMX(一)——簡介和Standard MBeanJMX超詳細解讀 參考資料JMX整理JMX簡介http://blog.csdn.net/DryKillLogic/articl

開始logback

概述 LogBack是一個日誌框架,它與Log4j可以說是同出一源,都出自Ceki Gülcü之手。(log4j的原型是早前由Ceki Gülcü貢獻給Apache基金會的)下載地址:http://logback.qos.ch/download.html LogBack、

開始git和github

1. git:工具 GitHub:網站,社交平臺,開源專案,遠端倉庫 2.建立一個庫drag git clone [url]路徑 設定貢獻者name、email 提交程式碼的時候把這兩個資訊記錄在版本庫裡 git config --global user.name "名字" git

開始學Xamarin.Forms() 環境搭建、創建項目

官方 log targe 4.4 pad jdk 新建文件夾 ini pos 一、環境搭建 Windows下環境搭建: 1.下載並安裝jdk 、Android SDK和NDK。當然還須要 VS2013 update 2(VS2010、VS2012均可)以上

開始學HTTP () HTTP結構與基礎

現象 encode 伸縮 協議 for 服務端 例如 lis 格式 HTTP結構與基礎 這篇文章中,我們主要針對HTTP\1.1版本進行介紹 請求報文和響應報文 請求報文 請求報文由客戶端發出,其格式為: 請求方法 請求URI 協議版本 可選的請求首部字段和內容實體,

開始人工智能-機器人服務-04

sta wid 圖片 回復 依賴包 http ase services space 前文書說到目前微軟的Bot機器人分為五類,也從以前的Bot Framework遷往Azure的Bot Service。利用QnA Maker,我們已經快速的做了一個對話機器人。那麽,

開始人工智能—人臉 API—02

per ans encoder 頭部 個人 api 照片 python nor 前文介紹了人臉API,但沒有一個完整的功能實現,各個功能的API始終如散開的珍珠一樣,不能串成珠鏈。到底這套API是如何工作的呢?Person、Person Group、FaceLis

開始人工智能-人臉 API-03

AI Cognitive Services Face API 人臉識別 前文我們嘗試寫了一個完整的人臉驗證過程,從創建一個組,一個人,到為人提供照片,並訓練AI,直至最後提供一張照片讓 AI 利用 Face API 判斷是不是這個特定的人。 另一個經常會用到的人臉識別,是在一張照

開始人工智能—機器視覺API—01

認知服務 機器視覺 Cognitive Services Computer Vision AI 我們使用Face API做了一些有趣的嘗試。從原理上來說,人臉識別算是計算機視覺的分支。所以,接下來我們了解一下計算機視覺就很順利成章了。 計算機視覺是非常熱門的人工智能方向,而我

開始人工智能—機器視覺API—02

AI Cognitive Services Computer Vision 機器視覺 人工智能 本期有福利哦!不要錯過啦! 前文簡單實現了認知服務對圖片的檢測識別。檢測識別是其他機器視覺實現的基礎,除了我們示例代碼涉及的初步“看懂”圖片,認知服務其實可以按照要求返回不同的信息

Python開始寫爬蟲()BeautifulSoup庫使用

Beautiful Soup 是一個可以從HTML或XML檔案中提取資料的Python庫, BeautifulSoup在解析的時候是依賴於解析器的,它除了支援Python標準庫中的HTML解析器,還支援一些第三方的解析器比如lxml等。可以從其官網得到更詳細的資訊:http://beau

開始學matplotlib畫圖(): 統計圖形入門

文章目錄 1. 柱狀圖(條形圖) —— bar() / barh() 2. 直方圖 —— hist() 3. 餅圖 —— pie() 4. 極線圖 —— polar() 5. 散點圖 —— scatter() 6.

開始學演算法()選擇排序

從零開始學演算法(二)選擇排序 選擇排序 演算法介紹 演算法原理 演算法簡單記憶說明 演算法複雜度和穩定性 程式碼實現 選擇排序 程式碼是Javascript語言寫的(幾乎是虛擬碼) 演算

技術 | Python開始系列連載(十九)

寫爬蟲防止被封的關鍵有以下幾點:  ●  偽裝請求報頭(request header)  ●  減輕訪問頻率,速度  ●  使用代理IP 一般第一點都能做到,第二點減輕訪問頻率就會大大增加任務時間,而使用代理就能

開始學深度學習:神經網路

本課程筆記來源於深享網課程《深度學習理論與實戰TensorFlow》 2.1學習的種類 學習的種類主要分成以下三類:監督學習、非監督學習和強化學習三種。接下來,將分別對這三種學習進行介紹。 監督學習: 對已經標記的訓練樣本進行學習,然後對樣本外的資料進行標記

開始學習Matplotlib(

文章目錄 新增圖例 Annotation 標註 添加註釋 annotate 添加註釋 text tick 能見度 有深度學習需求的小夥伴請點選原文連結【教程】第二章:圖例與標註,線上除錯程式碼,玩轉資料

開始學USB(、基礎知識2)

1.USB相關的硬體 USB裝置,從物理上的邏輯結構來說,包含了主機Host端和裝置Device端。 其中,主機Host端,有對應的硬體的USB的主機控制器Host Controller,而裝置端,連線的是對應的USB裝置。 1.1. USB控制器型別:OHCI,UHCI,

開始學caffe():caffe在win10下的安裝編譯

環境要求 作業系統:64位windows10 編譯環境:Visual Studio 2013 Ultimate版本 安裝流程 step1:檔案的下載 從GitHub新增連結描述中下載Windows版本的caffe,並進行解壓到電腦中。 step2:檔案修改 將壓縮包

開始學推薦系統:隱語義模型

2. 隱語義模型 隱語義模型又可稱為LFM(latent factor model),它從誕生到今天產生了很多著名的模型和方法,其中和該技術相關且耳熟能詳的名詞有pLSA、 LDA、隱含類別模型(latent class model)、隱含主題模型(latent topic model)、矩陣分解(matr