The setJmxMBeanRowStatus method shown above is called
by the SNMP runtime when the row is created remotely. It is also called explicitly
by JmxMBeanEntryImpl when the row is created after
receiving an MBean server notification.
Example 18-10 Activating and Destroying Rows
private void activate() throws SnmpStatusException {
if ((remoteCreation) && (mbean == null || name == null))
throw new SnmpStatusException(SnmpStatusException.snmpRspGenErr);
try {
if (remoteCreation) {
myGroup.registerMBean(mbean,name,this);
initJmxMBean(name);
remoteCreation = false;
mbean = null;
}
exposedAttrCount = myGroup.addAttributes(name,this);
if (Boolean.getBoolean("info"))
System.out.println(name.toString()+ ": added " +
exposedAttrCount
+ " attribute(s).");
JmxMBeanRowStatus =
new EnumJmxMBeanRowStatus(EnumRowStatus.active);
} catch (Exception x) {
SnmpStatusException sn =
new SnmpStatusException(SnmpStatusException.snmpRspGenErr);
sn.initCause(x);
throw sn;
}
}
private void destroy() throws SnmpStatusException {
try {
JmxMBeanRowStatus =
new EnumJmxMBeanRowStatus(EnumRowStatus.notInService);
if (name != null && remoteDeletion)
myGroup.unregisterMBean(name,this);
remoteCreation = false;
mbean = null;
if (name != null)
myGroup.removeAttributes(name,this);
attrList = null;
} catch (Exception x) {
SnmpStatusException sn =
new SnmpStatusException(SnmpStatusException.snmpRspGenErr);
sn.initCause(x);
throw sn;
}
}
|
Example 18-10 shows the activate
and destroy methods defined by JmxMBeanEntryImpl. The activate method verifies first of all
whether the row was created remotely or locally, and acts differently depending
on the answer. If the row was created remotely by calling the createFromRemote method, the row entry registers the requested MBean in the MBean.
If the row is created locally, this means that the request to create the row
was made by an existing registered MBean, so there is no need to register
it again in the MBean server.
The destroy method is created when the row is removed,
either locally by handleMBeanServerNotification or remotely.
The destroy method is called by removeEntryCb, which itself is called when the row is removed from the table,
whether remotely or locally.
18.2.3 Point of Entry into the SNMP Table Instrumentation Example
In this example, the table instrumentation operations
shown in the preceding sections are all demonstrated by a single class, the Agent. The fact that this Agent class creates
MBeans, and registers them in an MBean server so that they can be mirrored
by the SNMP MIB, is irrelevant to this example. The real purpose of the Agent is to demonstrate how to add instrumentation
to the SNMP tables using Java DMK technology, not to demonstrate what the
example actually does.
Example 18-11 Making an MBean Server Accessible by an SNMP Manager
public class Agent {
public interface SimpleMBean {
public String getName();
public int getCount();
public void reset();
}
public static class Simple implements SimpleMBean {
public Simple() {
this(null);
}
// Define MBean operations
[...]
}
public static MBeanServer getPlatformMBeanServer() {
final MBeanServer test = MBeanServerFactory.createMBeanServer();
final MBeanServer first = (MBeanServer)
MBeanServerFactory.findMBeanServer(null).get(0);
if (test != first) MBeanServerFactory.releaseMBeanServer(test);
return first;
}
public int populate(MBeanServer server, int mbeanCount) {
int count = 0;
for (int i=0; i<mbeanCount; i++) {
try {
final SimpleMBean simple = new Simple();
final ObjectName name =
new ObjectName("Example:type=Simple,name="+
simple.getName());
server.registerMBean(simple,name);
count ++;
System.out.println("Registered MBean: " + name);
} catch (Exception x) {
System.err.println("Failed to register MBean: " + x);
debug(x);
}
}
return count;
}
public int depopulate(MBeanServer server, int mbeanCount) {
int count = 0;
while (true) {
try {
final ObjectName pattern =
new ObjectName("Example:type=Simple,*");
Set mbeans = server.queryNames(pattern,null);
if (mbeans.isEmpty()) break;
for (Iterator it=mbeans.iterator(); it.hasNext() ; ) {
if (count == mbeanCount) return count;
final ObjectName next = (ObjectName) it.next();
try {
server.unregisterMBean(next);
count++;
System.out.println("Deregistered MBean: "
+ next);
} catch (InstanceNotFoundException x) {
continue;
}
}
if (count >= mbeanCount) break;
} catch (Exception x) {
System.err.println("Unexpected exception: " + x);
debug(x);
break;
}
}
return count;
}
[...]
|
|