從零開始玩轉JMX(二)——Condition
Notification
一個MBean提供的管理介面允許代理對其管理資源進行控制和配置。然而,對管理複雜的分散式系統來說,這些介面知識提供了一部分功能。通常,管理應用程式需要對狀態變化或者當特別情況發生變化時作出反映。Notification起到了MBean之間的溝通橋樑的作用。JMX Notification模型和Java Event模型類似,將一些重要的資訊,狀態的轉變,資料的變更傳遞給Notification Listener,以便資源的管理。
通知模型僅僅涉及了在同一個JMX代理中的管理構件之間的事件傳播。JMX通知模型依靠以下幾個部分:
- Notification,一個通用的事件型別,該類標識事件的型別,可以被直接使用,也可以根據傳遞的事件的需要而被擴充套件。
- NotificationListener介面,接受通知的物件需實現此介面。
- NotificationFilter介面,作為通知過濾器的物件需實現此介面,為通知監聽者提供了一個過濾通知的過濾器。
- 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