private static boolean testPrincipals(ObservedObject[] monitored, ObjectName[] monitorNames, Monitor[] monitor, String[] principals) throws Exception { for (int i = 0; i < 6; i++) { String principal = monitored[i].principal; String expected = principals[i / 3]; if (principal == null) { echo("Task not submitted " + new Date() + ". RETRY"); return false; } echo(">>> Monitor = " + monitorNames[i]); echo(">>> ObservedObject = " + monitor[i].getObservedObject()); echo(">>> ObservedAttribute = " + monitor[i].getObservedAttribute()); echo(">>> Principal = " + principal); if (expected.equals(principal)) { echo("\tOK: Got Expected principal"); } else { throw new Exception("Unexpected principal. Got: " + principal + " Expected: " + expected); } } return true; }
public static void main (String args[]) throws Exception { ObjectName[] mbeanNames = new ObjectName[6]; ObservedObject[] monitored = new ObservedObject[6]; ObjectName[] monitorNames = new ObjectName[6]; Monitor[] monitor = new Monitor[6]; String[] principals = { "role1", "role2" }; String[] attributes = { "Integer", "Double", "String" }; try { echo(">>> CREATE MBeanServer"); MBeanServer server = MBeanServerFactory.newMBeanServer(); for (int i = 0; i < 6; i++) { mbeanNames[i] = new ObjectName(":type=ObservedObject,instance=" + i); monitored[i] = new ObservedObject(); echo(">>> CREATE ObservedObject = " + mbeanNames[i].toString()); server.registerMBean(monitored[i], mbeanNames[i]); switch (i) { case 0: case 3: monitorNames[i] = new ObjectName(":type=CounterMonitor,instance=" + i); monitor[i] = new CounterMonitor(); break; case 1: case 4: monitorNames[i] = new ObjectName(":type=GaugeMonitor,instance=" + i); monitor[i] = new GaugeMonitor(); break; case 2: case 5: monitorNames[i] = new ObjectName(":type=StringMonitor,instance=" + i); monitor[i] = new StringMonitor(); break; } echo(">>> CREATE Monitor = " + monitorNames[i].toString()); server.registerMBean(monitor[i], monitorNames[i]); monitor[i].addObservedObject(mbeanNames[i]); monitor[i].setObservedAttribute(attributes[i % 3]); monitor[i].setGranularityPeriod(500); final Monitor m = monitor[i]; Subject subject = new Subject(); echo(">>> RUN Principal = " + principals[i / 3]); subject.getPrincipals().add(new JMXPrincipal(principals[i / 3])); PrivilegedAction<Void> action = new PrivilegedAction<Void>() { public Void run() { m.start(); return null; } }; Subject.doAs(subject, action); } while(!testPrincipals(monitored, monitorNames, monitor, principals)); } finally { for (int i = 0; i < 6; i++) if (monitor[i] != null) monitor[i].stop(); } }
/** * Run test */ public int runTest(int monitorType) throws Exception { ObjectName[] mbeanNames = new ObjectName[nTasks]; ObservedObject[] monitored = new ObservedObject[nTasks]; ObjectName[] monitorNames = new ObjectName[nTasks]; Monitor[] monitor = new Monitor[nTasks]; String[] attributes = { "Integer", "Double", "String" }; try { echo(">>> CREATE MBeanServer"); MBeanServer server = MBeanServerFactory.newMBeanServer(); String domain = server.getDefaultDomain(); for (int i = 0; i < nTasks; i++) { mbeanNames[i] = new ObjectName(":type=ObservedObject,instance=" + (i + 1)); monitored[i] = new ObservedObject(); echo(">>> CREATE ObservedObject = " + mbeanNames[i].toString()); server.registerMBean(monitored[i], mbeanNames[i]); switch (monitorType) { case 1: monitorNames[i] = new ObjectName(":type=CounterMonitor," + "instance=" + (i + 1)); monitor[i] = new CounterMonitor(); break; case 2: monitorNames[i] = new ObjectName(":type=GaugeMonitor," + "instance=" + (i + 1)); monitor[i] = new GaugeMonitor(); break; case 3: monitorNames[i] = new ObjectName(":type=StringMonitor," + "instance=" + (i + 1)); monitor[i] = new StringMonitor(); break; default: echo("Unsupported monitor type"); return 1; } echo(">>> CREATE Monitor = " + monitorNames[i].toString()); server.registerMBean(monitor[i], monitorNames[i]); monitor[i].addObservedObject(mbeanNames[i]); monitor[i].setObservedAttribute(attributes[monitorType-1]); monitor[i].setGranularityPeriod(50); monitor[i].start(); } if (!waiter.waiting(MAX_WAITING_TIME)) { echo("Error, not all "+nTasks+" monitor tasks are called after " +MAX_WAITING_TIME); return 1; } } finally { for (int i = 0; i < nTasks; i++) if (monitor[i] != null) monitor[i].stop(); } echo("All "+nTasks+" monitors are called."); return 0; }
@Override protected void addNotificationListener() throws Exception { JMXEndpoint ep = (JMXEndpoint) getEndpoint(); // create the monitor bean Monitor bean = null; if (ep.getMonitorType().equals("counter")) { CounterMonitor counter = new CounterMonitor(); Number initThreshold = convertNumberToAttributeType(ep.getInitThreshold(), ep.getJMXObjectName(), ep.getObservedAttribute()); Number offset = convertNumberToAttributeType(ep.getOffset(), ep.getJMXObjectName(), ep.getObservedAttribute()); Number modulus = convertNumberToAttributeType(ep.getModulus(), ep.getJMXObjectName(), ep.getObservedAttribute()); counter.setInitThreshold(initThreshold); counter.setOffset(offset); counter.setModulus(modulus); counter.setDifferenceMode(ep.isDifferenceMode()); counter.setNotify(true); bean = counter; } else if (ep.getMonitorType().equals("gauge")) { GaugeMonitor gm = new GaugeMonitor(); gm.setNotifyHigh(ep.isNotifyHigh()); gm.setNotifyLow(ep.isNotifyLow()); gm.setDifferenceMode(ep.isDifferenceMode()); Number highValue = convertNumberToAttributeType(ep.getThresholdHigh(), ep.getJMXObjectName(), ep.getObservedAttribute()); Number lowValue = convertNumberToAttributeType(ep.getThresholdLow(), ep.getJMXObjectName(), ep.getObservedAttribute()); gm.setThresholds(highValue, lowValue); bean = gm; } else if (ep.getMonitorType().equals("string")) { StringMonitor sm = new StringMonitor(); sm.setNotifyDiffer(ep.isNotifyDiffer()); sm.setNotifyMatch(ep.isNotifyMatch()); sm.setStringToCompare(ep.getStringToCompare()); bean = sm; } bean.addObservedObject(ep.getJMXObjectName()); bean.setObservedAttribute(ep.getObservedAttribute()); bean.setGranularityPeriod(ep.getGranularityPeriod()); // register the bean mMonitorObjectName = new ObjectName(ep.getObjectDomain(), "name", "camel-jmx-monitor-" + UUID.randomUUID()); ManagementFactory.getPlatformMBeanServer().registerMBean(bean, mMonitorObjectName); // add ourselves as a listener to it NotificationFilter nf = ep.getNotificationFilter(); getServerConnection().addNotificationListener(mMonitorObjectName, this, nf, bean); bean.start(); }