Akashic Records

JMX-Communication with Notifications 본문

오래된글/Java

JMX-Communication with Notifications

Andrew's Akashic Records 2018. 4. 9. 12:59
728x90

Components of the JMX notification model

MBean events are wrapped as notification objects and broadcast from MBeans. Notification listeners, like event listeners, register with MBeans in order to receive notifications, including user-deined notifications.


Component

Descripton


Notification broadcaster

An object that implements the javax.management.NotificationBroadcaster interface, allowing it to send notifications.


Notification

An object emitted from broadcaters that contain information for a listener.


Notificatioin listener

An object that implements the javax.management.NotificationListener interface, allowing it to receive notifiacaitons.


Notification filter

An obejct associated with a listener that can filter notifications, allowing only the desired notifications to be delivered to a listener.



The Notification class

The Notification class extends java.util.EventObject and is used as a super class for other notification classes.

The Notification class contains six member variables that are all accessible through getter methods.

The Notification class has several different constructors, each providing a different set of initializaation arguments for these class members.


Class member

Purpose

Message

A String object representing a message. This could be the reason for the notification.

SequenceNumber

A number indicating the order in relation of events from the source. The source populates this field if it intends to give listeners the ability to sort incoming notifications. The notification model makes no guaranties that notifications will be received in the order they were sent.

TimeStamp

The timestamp of the notification, represented as a long value.

Type

The dot-separated String value indicating the type of the notification. Not a class type. Fore example:acme.mbeanA.event1.

UserData

An object used to contain any data that a source wants to send to a notification listener.

Source

The source of the notification. This object contains an ObjectName or a reference to the object that generated the notification.



package com.daddycat.blog.jmx;


public interface HelloMBean {

public void setMessage(String message); → message 설정


public String getMessage();


public void sayingHello(); → 설정된 message로 Notification을 1초마다 발생한다.

public void shutup(); → Notification 중지

}



package com.daddycat.blog.jmx;


import javax.management.AttributeChangeNotification;

import javax.management.MBeanNotificationInfo;

import javax.management.Notification;

import javax.management.NotificationBroadcasterSupport;


public class Hello extends NotificationBroadcasterSupport implements HelloMBean, Runnable {

private String message = null;

private boolean stop = true;

private int sayCount = 0;

public Hello() {

message = "Hello, world";

}


public Hello(String message) {

this.message = message;

}



public void setMessage(String message) {

String oldValue = this.message;

this.message = message;

//source, sequenceNumber, timeStamp, msg, attributeName, attributeType, oldValue, newValue

AttributeChangeNotification atrChangeNotification =

new AttributeChangeNotification(this, 0, System.currentTimeMillis(), "Hello Message Change", "message", "String", oldValue, message);

sendNotification(atrChangeNotification);


}



public String getMessage() {

return message;

}



public void sayingHello() {

stop = false;

Thread t = new Thread(this);

t.start();

}


public void shutup() {

stop = true;

}



public void run() {

while(!stop) {

try {

System.out.println("waiting...");

Thread.sleep(1000);

System.out.println("Saying...");

} catch (InterruptedException e) {

e.printStackTrace();

}

// Type, Source, sequenceNumber, TimeStamp, Message

Notification notification = new Notification("DaddyCat.JMX.Say.Counter", this, sayCount++, System.currentTimeMillis(), message+"("+sayCount+")");

sendNotification(notification);

}

}


@Override

public MBeanNotificationInfo[] getNotificationInfo() {

String[] type = {"DaddyCat.JMX.Say.Counter" };

MBeanNotificationInfo[] info = new MBeanNotificationInfo[ 2 ];

info[ 0 ] = new MBeanNotificationInfo( type, "javax.management.Notification", "The HelloMBean counter" );

String[] attChanges = {

AttributeChangeNotification.ATTRIBUTE_CHANGE };

info[ 1 ] = new MBeanNotificationInfo( attChanges, "javax.management.AttributeChangeNotification", "The HelloMBean counter" );

return info;

}

}

AttributeChangeNotification은 MBean의 Attribute가 변경되었을 때 사용된다.  해당 attributeName, attributeType, oldValue, newValue가 포함된다.



package com.daddycat.blog.jmx;


import java.lang.management.ManagementFactory;


import javax.management.MBeanServer;

import javax.management.Notification;

import javax.management.NotificationListener;

import javax.management.ObjectName;



public class NotificationAgent implements NotificationListener {

private MBeanServer mbs = null;


public NotificationAgent() {


// Get the platform MBeanServer

mbs = ManagementFactory.getPlatformMBeanServer();

// Unique identification of MBeans

Hello helloBean = new Hello();

ObjectName helloName = null;


try {

// Uniquely identify the MBeans and register them with the platform

// MBeanServer

helloName = new ObjectName("DADDYCAT:name=Communication_Notification");

mbs.registerMBean(helloBean, helloName);

helloBean.addNotificationListener(this, null, null); → 리스너 등록

} catch (Exception e) {

e.printStackTrace();

}

}


// Utility method: so that the application continues to run

private static void waitForEnterPressed() {

try {

System.out.println("Press  to continue...");

System.in.read();

} catch (Exception e) {

e.printStackTrace();

}

}


public static void main(String argv[]) {

NotificationAgent agent = new NotificationAgent();

System.out.println("Communication_Notification is running...");

NotificationAgent.waitForEnterPressed();

}


@Override

public void handleNotification(Notification notification, Object handback) {

System.out.println("Receiving notification....");

System.out.println(notification.getType());

System.out.println(notification.getMessage());

}

}


NtoficationAgent의 Operation의 sayingHello을 실행하면 Notification이 전달 된다.

물론 shutup을 실행하면 중지.



Attribute의 Message을 수정하면 AttributeChangeNotification이 발생한다.




728x90

'오래된글 > Java' 카테고리의 다른 글

JUnitParams  (0) 2018.04.09
JNI Hello World Program  (0) 2018.04.09
JMS - 기초  (0) 2018.04.09
자바 nio - 14  (0) 2018.04.09
자바 nio - 13  (0) 2018.04.09
Comments