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 でも同じように稼動します。

|
|