/** * This method is handles a notification when the Timer for the schedule * times out. * * @see javax.management.NotificationListener#handleNotification(javax.management.Notification, * java.lang.Object) * @param pNotification * The Notification. * @param pHandback * A Timer stating the time when the Notification should be * invoked. */ public void handleNotification(final Notification pNotification, final Object pHandback) { if (pHandback == null) { LOG.error("The timer stating the next scheduled query execution time is null!"); return; } Timer timer = (Timer) pHandback; if (!doItAgain.booleanValue()) { timer.stop(); } else { // execute the query and determine next scheduled execution time executeQuery(); setNextScheduledExecutionTime(timer); } }
@Test(expected=RuntimeException.class) public void testDoubleRegister() throws Exception { ControlService cs = new JMXControlService(DOMAIN, new Hashtable<>()); String type = "timer"; String id = "a"; String alias = "ControlA"; String controlId = cs.registerControl(type, id, alias, TimerMBean.class, new Timer()); try { cs.registerControl(type, id, alias, TimerMBean.class, new Timer()); } finally { cs.unregister(controlId); } }
@Test(expected=RuntimeException.class) public void testDoubleunregister() throws Exception { ControlService cs = new JMXControlService(DOMAIN, new Hashtable<>()); String type = "timer"; String id = "a"; String alias = "ControlA"; String controlId = cs.registerControl(type, id, alias, TimerMBean.class, new Timer()); cs.unregister(controlId); cs.unregister(controlId); }
public static void main(String[] args) throws Exception { // This JMXServiceURL works only if the connector server is in-VM with // the connector. If this is not the case, set the correct host name. JMXServiceURL address = new JMXServiceURL("soap", null, 8080, "/jmxconnector"); // Connect a JSR 160 JMXConnector to the server side JMXConnector connector = JMXConnectorFactory.connect(address); // Retrieve an MBeanServerConnection that represent the MBeanServer // the remote connector server is bound to MBeanServerConnection connection = connector.getMBeanServerConnection(); // Call the server side as if it is a local MBeanServer ObjectName delegateName = ObjectName.getInstance("JMImplementation:type=MBeanServerDelegate"); Object proxy = MBeanServerInvocationHandler.newProxyInstance(connection, delegateName, MBeanServerDelegateMBean.class, true); MBeanServerDelegateMBean delegate = (MBeanServerDelegateMBean)proxy; System.out.println(delegate.getImplementationVendor() + " is cool !"); // Register an MBean, and get notifications via the SOAP protocol connection.addNotificationListener(delegateName, new NotificationListener() { public void handleNotification(Notification notification, Object handback) { System.out.println("Got the following notification: " + notification); } }, null, null); ObjectName timerName = ObjectName.getInstance("services:type=Timer"); connection.createMBean(Timer.class.getName(), timerName, null); // Unregistering the MBean to get another notification connection.unregisterMBean(timerName); // Allow the unregistration notification to arrive before killing this JVM Thread.sleep(1000); connector.close(); }
public static void main(String[] args) throws Exception { // This JMXServiceURL works only if the connector server is on the same host of // the connector. If this is not the case, set the correct host name. JMXServiceURL address = new JMXServiceURL("hessian", null, 8080, "/hessian"); // Connect a JSR 160 JMXConnector to the server side JMXConnector connector = JMXConnectorFactory.connect(address); // Retrieve an MBeanServerConnection that represent the MBeanServer // the remote connector server is bound to MBeanServerConnection connection = connector.getMBeanServerConnection(); // Call the server side as if it is a local MBeanServer ObjectName delegateName = ObjectName.getInstance("JMImplementation:type=MBeanServerDelegate"); Object proxy = MBeanServerInvocationHandler.newProxyInstance(connection, delegateName, MBeanServerDelegateMBean.class, true); MBeanServerDelegateMBean delegate = (MBeanServerDelegateMBean)proxy; System.out.println(delegate.getImplementationVendor() + " is cool !"); // Register an MBean, and get notifications via the Hessian protocol connection.addNotificationListener(delegateName, new NotificationListener() { public void handleNotification(Notification notification, Object handback) { System.out.println("Got the following notification: " + notification); } }, null, null); ObjectName timerName = ObjectName.getInstance("services:type=Timer"); connection.createMBean(Timer.class.getName(), timerName, null); // Unregistering the MBean to get another notification connection.unregisterMBean(timerName); // Allow the unregistration notification to arrive before killing this JVM Thread.sleep(1000); connector.close(); }
/** * Starts a Timer to get this query executed in specific time intervals. * * @throws ImplementationException * If the next scheduled date cannot be evaluated. */ private void startThread() throws ImplementationExceptionResponse { Timer nextAction = new Timer(); nextAction.addNotificationListener(this, null, nextAction); Date nextSchedule = schedule.nextScheduledTime().getTime(); nextAction.addNotification("SubscriptionSchedule", "Please do the query", null, nextSchedule); nextAction.start(); }
/** * Determines the next scheduled execution time for this subscribed query. * * @param timer * The Timer to set the next scheduled time. * @throws IllegalArgumentException */ protected void setNextScheduledExecutionTime(final Timer timer) throws IllegalArgumentException { try { Date nextSchedule = schedule.nextScheduledTime().getTime(); LOG.debug("Next scheduled time for the subscribed query is '" + nextSchedule + "'."); timer.addNotification("SubscriptionSchedule", "Please do the query", timer, nextSchedule); } catch (ImplementationExceptionResponse e) { String msg = "The next scheduled date for the subscribed query with ID '" + getSubscriptionID() + "' cannot be evaluated: " + e.getMessage(); LOG.error(msg, e); } }
/** * Start of the timer service */ private void startTimer() { try { server = MBeanServerFactory.createMBeanServer(); timer = new Timer(); timerName = new ObjectName("test:type=timer"); server.registerMBean(timer, timerName); server.addNotificationListener(timerName, this, null, null); timer.start(); } catch (Exception e) { e.printStackTrace(); } }
public static void main(String[] args) throws Exception { System.out.println( ">>> Test on timer start method with past notifications."); System.out.println(">>> Create a Timer object."); Timer timer = new Timer(); System.out.println( ">>> Set the flag (setSendPastNotification) to true."); timer.setSendPastNotifications(true); timer.addNotificationListener(myListener, null, null); System.out.println(">>> Add notifications: " + SENT); Date date = new Date(); for (int i = 0; i < SENT; i++) { timer.addNotification( "testType" + i, "testMsg" + i, "testData" + i, date); } System.out.println(">>> The notifications should be sent at " + date); System.out.println(">>> Sleep 100 ms to have past notifications."); Thread.sleep(100); System.out.println(">>> Start the timer at " + new Date()); timer.start(); System.out.println(">>> Stop the timer."); Thread.sleep(100); stopping = true; timer.stop(); if (received != SENT) { throw new RuntimeException( "Expected to receive " + SENT + " but got " + received); } System.out.println(">>> Received all expected notifications."); System.out.println(">>> Bye bye!"); }
public static void main(String[] args) throws Exception { System.out.println( ">>> Test for missing notifications."); System.out.println(">>> Create a Timer object."); final Timer timer = new Timer(); timer.start(); NotifListener listener = new NotifListener(); timer.addNotificationListener(listener, null, null); ExecutorService executor = Executors.newFixedThreadPool(100); final Random rand = new Random(); for (int i = 0; i < TASK_COUNT; i++) { executor.execute(new Runnable() { public void run() { long dateMillis = System.currentTimeMillis() + fixedDelay + rand.nextInt(2000); Date date = new Date(dateMillis); timer.addNotification("type", "msg", "userData", date); } }); } executor.shutdown(); executor.awaitTermination(20, TimeUnit.SECONDS); waitForNotificationsToEnd(listener); timer.stop(); if (listener.count < TASK_COUNT) { throw new RuntimeException("Not fired: " + (TASK_COUNT - listener.count)); } else { System.out.println(">>> All notifications handled OK"); } System.out.println(">>> Bye bye!"); }
public static void main(String[] args) throws Exception { // Replace the value with the file path of your keystore. // IMPORTANT: this should NOT be done in production environments, it is shown here just as an example. System.setProperty("javax.net.ssl.trustStore", "<your-keystore>"); // This JMXServiceURL works only if the connector server is on the same host of // the connector. If this is not the case, set the correct host name. JMXServiceURL address = new JMXServiceURL("hessian+ssl", null, 8443, "/hessianssl"); // Connect a JSR 160 JMXConnector to the server side JMXConnector connector = JMXConnectorFactory.connect(address); // Retrieve an MBeanServerConnection that represent the MBeanServer // the remote connector server is bound to MBeanServerConnection connection = connector.getMBeanServerConnection(); // Call the server side as if it is a local MBeanServer ObjectName delegateName = ObjectName.getInstance("JMImplementation:type=MBeanServerDelegate"); Object proxy = MBeanServerInvocationHandler.newProxyInstance(connection, delegateName, MBeanServerDelegateMBean.class, true); MBeanServerDelegateMBean delegate = (MBeanServerDelegateMBean)proxy; System.out.println(delegate.getImplementationVendor() + " is cool !"); // Register an MBean, and get notifications via the Hessian protocol connection.addNotificationListener(delegateName, new NotificationListener() { public void handleNotification(Notification notification, Object handback) { System.out.println("Got the following notification: " + notification); } }, null, null); ObjectName timerName = ObjectName.getInstance("services:type=Timer"); connection.createMBean(Timer.class.getName(), timerName, null); // Unregistering the MBean to get another notification connection.unregisterMBean(timerName); // Allow the unregistration notification to arrive before killing this JVM Thread.sleep(1000); connector.close(); }
public Date getExpires() { long expires = (this.getIssued().getTime() + ((this.getDuration()) * Timer.ONE_DAY)); return new Date(expires); }
/** * {@inheritDoc} First checks on the trigger condition: if fulfilled then * execute Query. * * @see org.fosstrak.epcis.repository.query.QuerySubscriptionScheduled#handleNotification(javax.management.Notification, * java.lang.Object) */ @Override public void handleNotification(final Notification pNotification, final Object pHandback) { if (pHandback == null) { LOG.error("The timer stating the next scheduled query execution time is null!"); return; } Timer timer = (Timer) pHandback; if (!doItAgain.booleanValue()) { timer.stop(); } else { try { LOG.debug("Checking trigger condition ..."); String queryName = "SimpleEventQuery"; QueryParams params = new QueryParams(); // add MATCH_anyEPC query param QueryParam param = new QueryParam(); param.setName("MATCH_anyEPC"); ArrayOfString strings = new ArrayOfString(); strings.getString().add(trigger); param.setValue(strings); params.getParam().add(param); // add GE_recordTime query param param = new QueryParam(); param.setName("GE_recordTime"); param.setValue(initialRecordTime); params.getParam().add(param); // send the query Poll poll = new Poll(); poll.setParams(params); poll.setQueryName(queryName); QueryResults results = executePoll(poll); if (results != null && results.getResultsBody() != null && results.getResultsBody().getEventList() != null) { LOG.debug("Trigger condition fulfilled!"); LOG.debug("Executing subscribed query associated with trigger event ..."); super.executeQuery(); LOG.debug("Triggered query successfully executed!"); } } catch (Exception e) { String msg = "An error occurred while checking trigger condition for query with subscriptionID '" + subscriptionID + "': " + e.getMessage(); LOG.error(msg, e); } // determine next scheduled execution time setNextScheduledExecutionTime(timer); } }
@Test public void testControlObject() throws Exception { ControlService cs = new JMXControlService(DOMAIN, new Hashtable<>()); String type = "timer"; String id = "a"; String alias = "ControlA"; String controlId = cs.registerControl(type, id, alias, TimerMBean.class, new Timer()); assertNotNull(controlId); ObjectName on = ObjectName.getInstance(controlId); assertEquals(DOMAIN, on.getDomain()); assertEquals(type, ObjectName.unquote(on.getKeyProperty("type"))); assertEquals(id, ObjectName.unquote(on.getKeyProperty("id"))); assertEquals(alias, ObjectName.unquote(on.getKeyProperty("alias"))); assertEquals(TimerMBean.class.getName(), ObjectName.unquote(on.getKeyProperty("interface"))); MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); assertTrue(mbs.isRegistered(on)); cs.unregister(controlId); assertFalse(mbs.isRegistered(on)); }
@Test public void testAdditionalKeys() throws Exception { Hashtable<String,String> addKeys = new Hashtable<>(); addKeys.put("job", "jobid"); addKeys.put("device", ObjectName.quote("pi")); ControlService cs = new JMXControlService(DOMAIN, addKeys); String type = "timer"; String id = "a"; String alias = "ControlA"; String controlId = cs.registerControl(type, id, alias, TimerMBean.class, new Timer()); assertNotNull(controlId); ObjectName on = ObjectName.getInstance(controlId); assertEquals(DOMAIN, on.getDomain()); assertEquals(type, ObjectName.unquote(on.getKeyProperty("type"))); assertEquals(id, ObjectName.unquote(on.getKeyProperty("id"))); assertEquals(alias, ObjectName.unquote(on.getKeyProperty("alias"))); assertEquals(TimerMBean.class.getName(), ObjectName.unquote(on.getKeyProperty("interface"))); assertEquals("jobid", on.getKeyProperty("job")); assertEquals("pi", ObjectName.unquote(on.getKeyProperty("device"))); MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); assertTrue(mbs.isRegistered(on)); cs.unregister(controlId); assertFalse(mbs.isRegistered(on)); }