Hello recently I started working on a JMX bean implementation.
I then publish the below bean, run JConsole, connect to the bean, register for notification. However when the notification is sent i get the following error:
Apr 13, 2012 5:31:26 PM ClientNotifForwarder NotifFetcher.fetchOneNotif WARNING: Failed to deserialize a notification: java.io.NotSerializableException: com.*.jmx.TaskMergeMBean
Any help will be most welcome, I've spent the better part of a day trying to figure this one out.
Thanks, Jonathan
public class TaskMBean extends NotificationBroadcasterSupport implements DynamicMBean {
private final TaskStateChangedEventListener taskChangedListener;
public TaskMBean (DriverIf driver) {
taskChangedListener= new TaskStateChangedEventListener (this);
driver.registerMergeTaskStateChangedListener(mergeTaskChangedListener);
}
@Override
public MBeanNotificationInfo[] getNotificationInfo() {
String[] types = new String[] { AttributeChangeNotification.ATTRIBUTE_CHANGE };
String name = AttributeChangeNotification.class.getName();
String description = "An attribute of this MBean has changed";
MBeanNotificationInfo info = new MBeanNotificationInfo(types, name,description);
return new MBeanNotificationInfo[] { info };
}
@Override
public Object getAttribute(String attribute) throws AttributeNotFoundException, MBeanException,
ReflectionException {
// TODO Auto-generated method stub
return null;
}
@Override
public void setAttribute(Attribute attribute) throws AttributeNotFoundException,
InvalidAttributeValueException, MBeanException, ReflectionException {
// TODO Auto-generated method stub
}
@Override
public AttributeList getAttributes(String[] attributes) {
// TODO Auto-generated method stub
return null;
}
@Override
public AttributeList setAttributes(AttributeList attributes) {
// TODO Auto-generated method stub
return null;
}
@Override
public Object invoke(String actionName, Object[] params, String[] signature)
throws MBeanException, ReflectionException {
// TODO Auto-generated method stub
return null;
}
@Override
public MBeanInfo getMBeanInfo() {
MBeanNotificationInfo haltInfo =
new MBeanNotificationInfo(
new String[] { "NOTIFICATION_TYPE_MERGE_STATE_CHANGE" },
Notification.class.getName(), "server halt on fatal error");
MBeanNotificationInfo[] notifications = new MBeanNotificationInfo[] { haltInfo };
return new OpenMBeanInfoSupport(XhiveMergeMBean.class.getName(), "", null, null, null,
notifications);
}
}
public class TaskStateChangedEventListener implements Serializable {
static final String NOTIFICATION_TYPE_MERGE_STATE_CHANGE = "com.xhive.lucene.merge";
private final NotificationBroadcasterSupport broadcaster;
private int notificationSequence = 1;
public TaskStateChangedEventListener (NotificationBroadcasterSupport broadcaster) {
this.broadcaster = broadcaster;
}
@Override
public void notify(Object source) {
Notification n =
new AttributeChangeNotification(this, notificationSequence++, System.currentTimeMillis(), "", "", "int", 1, 2);
broadcaster.sendNotification(n);
}
}