初めての JMX (通知 [Notification])

JMX では前回紹介した機能の他に、「通知 (Notification)」という Java のイベント通知と非常によく似たモデルを使用して MBean 同士のメッセージのやりとりを行うことが可能です。

たとえば、MBean の状態が変化した時に、その変化したことを知りたい他のクラス (= Listener) に通知する、ということができます。
前回の MBean にこの「通知」の機能を追加してみましょう。


通知を発行する側での実装

通知を発行する側では NotificationBroadcasterSupport を extends します。

package JMX_test;

import javax.management.*;

public class MessageBox
 extends NotificationBroadcasterSupport
 implements MessageBoxMBean {

private String message = null;

public MessageBox() {
this.message = "こんにちは!! コンストラクタが作成したメッセージです。";
}

public MessageBox(String msg) {
this.message = msg;
}

public void setMessage(String msg) {
this.message = msg;

Notification ntf = new Notification( "test", this, -1, System.currentTimeMillis(), message );
sendNotification( ntf );

}

public String getMessage() {
return message;
}

public void printMessage() {
System.out.println( message );
}

}

メッセージが変更されるのは setMessage メソッドでなので、その中で通知を行うことにします。

通知を行うために Notification オブジェクトのインスタンスを作成し、sendNotification の引数としてその通知を送ります。

public void setMessage(String msg) {
this.message = msg;

Notification ntf = new Notification( "test", this, -1, System.currentTimeMillis(), message );
sendNotification( ntf );


}

通知を受け取る側での実装

今回は通知を受け取るのはエージェントにして、通知が届いたことと、その内容を取得して表示させるようにしてみました。

package JMX_test;

import javax.management.*;
import com.sun.jdmk.comm.*;

public class MessageAgent implements NotificationListener {

public MessageAgent() {

MBeanServer mbs = MBeanServerFactory.createMBeanServer("MessageAgent");
HtmlAdaptorServer has = new HtmlAdaptorServer();
MessageBox msgbox = new MessageBox();

try {

ObjectName msgboxName = new ObjectName("MessageAgent:name=MessageBox");
mbs.registerMBean( msgbox, msgboxName );
msgbox.addNotificationListener( this, null, null );

ObjectName hasName = new ObjectName("MessageAgent:name=HTMLAdaptor, port=8082");
has.setPort(8082);
mbs.registerMBean( has, hasName );
System.out.println("HTMLAdaptor 開始中");
has.start();

} catch (Exception e) {
e.printStackTrace();
}
}

public void handleNotification( Notification ntf, Object handback ) {
System.out.println("通知の到着");
System.out.println( ntf.getMessage() );
}

public static void main( String args[] ) {
System.out.println("MessageAgent 実行中");
MessageAgent msgAgent = new MessageAgent();
}

}

通知を受け取るクラスは NotificationListener インターフェイスを implements します。

通知を発行する MBean である MessageBox クラスに対して通知を Listen していることを登録します。

msgbox.addNotificationListener( this, null, null );

通知が来た時に、それを処理するための handleNotification メソッドを作成します。

public void handleNotification( Notification ntf, Object handback ) {
System.out.println("通知の到着");
System.out.println( ntf.getMessage() );
}

実行

今回は iSeries 上の Qshell で実行してみました。OS/400 は V5R1 ですが、V5R2 でも同じでしょう。

前回と同じように新しい Message の値をセットして「Apply」ボタンを押します。これで setMessage メソッドが MBean で実行されますので、通知が発行されて、エージェントがそれを受け取って処理を行うはずです。

エージェントの実行画面を見ると、通知が到着したことと、その通知の元となった新しいメッセージが表示されているのが確認できます。

ちゃんと PC でも同じように稼動します。

[Top Pageに戻る]

[PR] | 貴金属 買取ハウスクリーニング韓国食材インプラント転職サイトSEOアクセス解析ハウスメーカーレンタルオフィスSEO対策消費者金融不動産担保ローン時計車 買取ハワイ挙式アスクル転職生命保険テンプレート沖縄旅行動画免許合宿二輪引越し消費者金融税理士ゴルフ会員権留学レーシックマッサージFX投資信託くりっく365アフィリエイト育毛剤FXホームページ制作デイトレードFXタイバンコクハワイ レンタカーベスト ハワイ ホテル レーツバリ島年末年始ハワイHawaii hotelsHawaii Activitiesbhhrホノルルマラソン
【運営会社「パラダイムシフト」サービス】 ハワイ現地オプショナルツアーリラックマ) - ビジネスクラス航空券 - 格安航空券(1) - 格安航空券(2) - 海外ホテル - 韓国旅行
無料ホームページ作成 - レンタルサーバー - 携帯ホームページ - ブログ - ホテル 予約 - タイムシェア - ヴィラ - ハワイ コンドミニアム - バリ島 ホテル - ハワイ 不動産 - プーケット ホテル