/** Actions before every test case (common) */ public void setUp() { res = true; sensor.setDouble(new Double(0)); sensor.setNullFlag(false); sensor.setExceptionFlag(false); server = MBeanServerFactory.createMBeanServer(); monitor = new GaugeMonitor(); try { monitorName = new ObjectName( "org.apache.harmony.test.func.api.javax.management.monitor." + "gaugemonitor:type=GaugeMonitor,id=1"); sensorName = new ObjectName(SinusFunction.SENSOR_NAME_TEMPLATE + "1"); } catch (Throwable e) { e.printStackTrace(); log.add("Test: ERROR: Internal error!"); System.exit(106); } monitor.addNotificationListener(nListener, null, "handback"); }
public void setUp() { try { server = MBeanServerFactory.createMBeanServer(); monitor = new GaugeMonitor(); sensor = new Impulse(100, 100, testedClass[0], testedClass[1]); server.registerMBean(monitor, new ObjectName( "org.apache.harmony.test.func.api.javax.management.monitor." + "countermonitor:type=CounterMonitor,id=1")); sensorName = new ObjectName(Impulse.SENSOR_NAME_TEMPLATE + "1"); server.registerMBean(sensor, sensorName); monitor.addNotificationListener(nListener, null, "handback"); /* setup monitor */ monitor.addObservedObject(sensorName); monitor.setObservedAttribute("Value"); monitor.setGranularityPeriod(50); monitor.setNotifyHigh(true); monitor.setNotifyLow(true); Thread sensorThread = new Thread(sensor); sensorThread.setDaemon(true); sensorThread.start(); } catch (Throwable t) { t.printStackTrace(); } }
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(); } }
/** * Update the gauge and check for notifications */ public int gaugeMonitorNotification() throws Exception { GaugeMonitor gaugeMonitor = new GaugeMonitor(); try { // Create a new GaugeMonitor MBean and add it to the MBeanServer. // echo(">>> CREATE a new GaugeMonitor MBean"); ObjectName gaugeMonitorName = new ObjectName( domain + ":type=" + GaugeMonitor.class.getName()); server.registerMBean(gaugeMonitor, gaugeMonitorName); echo(">>> ADD a listener to the GaugeMonitor"); gaugeMonitor.addNotificationListener(this, null, null); // // MANAGEMENT OF A STANDARD MBEAN // echo(">>> SET the attributes of the GaugeMonitor:"); gaugeMonitor.addObservedObject(obsObjName); echo("\tATTRIBUTE \"ObservedObject\" = " + obsObjName); gaugeMonitor.setObservedAttribute("IntegerAttribute"); echo("\tATTRIBUTE \"ObservedAttribute\" = IntegerAttribute"); gaugeMonitor.setNotifyLow(false); gaugeMonitor.setNotifyHigh(false); echo("\tATTRIBUTE \"Notify Low Flag\" = false"); echo("\tATTRIBUTE \"Notify High Flag\" = false"); Integer highThreshold = 3, lowThreshold = 2; gaugeMonitor.setThresholds(highThreshold, lowThreshold); echo("\tATTRIBUTE \"Low Threshold\" = " + lowThreshold); echo("\tATTRIBUTE \"High Threshold\" = " + highThreshold); int granularityperiod = 500; gaugeMonitor.setGranularityPeriod(granularityperiod); echo("\tATTRIBUTE \"GranularityPeriod\" = " + granularityperiod); echo(">>> START the GaugeMonitor"); gaugeMonitor.start(); // Check if notification was received // doWait(); if (messageReceived) { echo("\tOK: GaugeMonitor got RUNTIME_ERROR notification!"); } else { echo("\tKO: GaugeMonitor did not get " + "RUNTIME_ERROR notification!"); return 1; } } finally { messageReceived = false; if (gaugeMonitor != null) gaugeMonitor.stop(); } return 0; }
/** * 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(); }
public static void main(String[] args) throws Exception { // Let's create the MBeanServer MBeanServer server = MBeanServerFactory.newMBeanServer(); // Let's create a dynamic MBean and register it DynamicService serviceMBean = new DynamicService(); ObjectName serviceName = new ObjectName("examples", "mbean", "dynamic"); server.registerMBean(serviceMBean, serviceName); // Now let's register a Monitor // We would like to know if we have peaks in activity, so we can use JMX's // GaugeMonitor GaugeMonitor monitorMBean = new GaugeMonitor(); ObjectName monitorName = new ObjectName("examples", "monitor", "gauge"); server.registerMBean(monitorMBean, monitorName); // Setup the monitor: we want to be notified if we have too many clients or too less monitorMBean.setThresholds(new Integer(8), new Integer(4)); // Setup the monitor: we want to know if a threshold is exceeded monitorMBean.setNotifyHigh(true); monitorMBean.setNotifyLow(true); // Setup the monitor: we're interested in absolute values of the number of clients monitorMBean.setDifferenceMode(false); // Setup the monitor: link to the service MBean monitorMBean.addObservedObject(serviceName); monitorMBean.setObservedAttribute("ConcurrentClients"); // Setup the monitor: a short granularity period monitorMBean.setGranularityPeriod(50L); // Setup the monitor: register a listener monitorMBean.addNotificationListener(new NotificationListener() { public void handleNotification(Notification notification, Object handback) { System.out.println(notification); } }, null, null); // Setup the monitor: start it monitorMBean.start(); // Now start also the service serviceMBean.start(); }
/** * Update the gauge and check for notifications */ public int gaugeMonitorNotification() throws Exception { GaugeMonitor gaugeMonitor = new GaugeMonitor(); try { // Create a new GaugeMonitor MBean and add it to the MBeanServer. // echo(">>> CREATE a new GaugeMonitor MBean"); ObjectName gaugeMonitorName = new ObjectName( domain + ":type=" + GaugeMonitor.class.getName()); server.registerMBean(gaugeMonitor, gaugeMonitorName); echo(">>> ADD a listener to the GaugeMonitor"); gaugeMonitor.addNotificationListener(this, null, null); // // MANAGEMENT OF A STANDARD MBEAN // echo(">>> SET the attributes of the GaugeMonitor:"); gaugeMonitor.addObservedObject(obsObjName); echo("\tATTRIBUTE \"ObservedObject\" = " + obsObjName); gaugeMonitor.setObservedAttribute("IntegerAttribute"); echo("\tATTRIBUTE \"ObservedAttribute\" = IntegerAttribute"); gaugeMonitor.setNotifyLow(false); gaugeMonitor.setNotifyHigh(false); echo("\tATTRIBUTE \"Notify Low Flag\" = false"); echo("\tATTRIBUTE \"Notify High Flag\" = false"); Integer highThreshold = 3, lowThreshold = 2; gaugeMonitor.setThresholds(highThreshold, lowThreshold); echo("\tATTRIBUTE \"Low Threshold\" = " + lowThreshold); echo("\tATTRIBUTE \"High Threshold\" = " + highThreshold); int granularityperiod = 500; gaugeMonitor.setGranularityPeriod(granularityperiod); echo("\tATTRIBUTE \"GranularityPeriod\" = " + granularityperiod); echo(">>> START the GaugeMonitor"); gaugeMonitor.start(); // Wait for granularity period (multiplied by 2 for sure) // Thread.sleep(granularityperiod * 2); // Check if notification was received // if (messageReceived) { echo("\tOK: GaugeMonitor got RUNTIME_ERROR notification!"); } else { echo("\tKO: GaugeMonitor did not get " + "RUNTIME_ERROR notification!"); return 1; } } finally { messageReceived = false; if (gaugeMonitor != null) gaugeMonitor.stop(); } return 0; }
void run() throws Exception { final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); final ObjectName observedName = new ObjectName("a:b=c"); final ObjectName monitorName = new ObjectName("a:type=Monitor"); mbs.registerMBean(new GaugeMonitor(), monitorName); final GaugeMonitorMBean monitorProxy = JMX.newMBeanProxy(mbs, monitorName, GaugeMonitorMBean.class); final TestMBean observedProxy = JMX.newMBeanProxy(mbs, observedName, TestMBean.class); final Runnable sensitiveThing = new Runnable() { public void run() { doSensitiveThing(monitorProxy, observedName); } }; final Runnable nothing = new Runnable() { public void run() {} }; final Runnable withinGetAttribute = (when == When.IN_GET_ATTRIBUTE) ? sensitiveThing : nothing; mbs.registerMBean(new Test(withinGetAttribute), observedName); monitorProxy.addObservedObject(observedName); monitorProxy.setObservedAttribute("Thing"); monitorProxy.setThresholds(105, 100); monitorProxy.setGranularityPeriod(10L); // 10 ms monitorProxy.setNotifyHigh(true); monitorProxy.setNotifyLow(true); monitorProxy.start(); final int initGetCount = observedProxy.getGetCount(); int getCount = initGetCount; for (int i = 0; i < 2000; i++) { // 2000 * 10 = 20 seconds getCount = observedProxy.getGetCount(); if (getCount != initGetCount) break; Thread.sleep(10); } if (getCount <= initGetCount) throw new Exception("Test failed: presumable deadlock"); // This won't show up as a deadlock in CTRL-\ or in // ThreadMXBean.findDeadlockedThreads(), because they don't // see that thread A is waiting for thread B (B.join()), and // thread B is waiting for a lock held by thread A // Now we know the monitor has observed the initial value, // so if we want to test notify behaviour we can trigger by // exceeding the threshold. if (when == When.IN_NOTIFY) { final AtomicInteger notifCount = new AtomicInteger(); final NotificationListener listener = new NotificationListener() { public void handleNotification(Notification n, Object h) { Thread t = new Thread(sensitiveThing); t.start(); try { t.join(); } catch (InterruptedException e) { throw new RuntimeException(e); } notifCount.incrementAndGet(); } }; mbs.addNotificationListener(monitorName, listener, null, null); observedProxy.setThing(1000); for (int i = 0; i < 2000 && notifCount.get() == 0; i++) Thread.sleep(10); if (notifCount.get() == 0) throw new Exception("Test failed: presumable deadlock"); } }