package org.opendaylight.openflowplugin.applications.frm;
import java.lang.management.ManagementFactory;
+import javax.annotation.PreDestroy;
import javax.inject.Inject;
+import javax.inject.Singleton;
import javax.management.InstanceAlreadyExistsException;
+import javax.management.InstanceNotFoundException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;
+import javax.management.ObjectInstance;
import javax.management.ObjectName;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public final class ReconciliationJMXAgent {
+@Singleton
+@Component(service = { })
+public final class ReconciliationJMXAgent implements AutoCloseable {
private static final Logger LOG = LoggerFactory.getLogger(ReconciliationJMXAgent.class);
- private static final String OF_RECONC_BEANNAME
- = "org.opendaylight.openflowplugin.frm:type=ReconciliationState";
- private MBeanServer mbs = null;
- private ObjectName objectName = null;
+ private static final ObjectName OF_RECONF_OBJNAME;
- @Inject
- public ReconciliationJMXAgent(final ReconciliationJMXService reconciliationJMXService) {
- mbs = ManagementFactory.getPlatformMBeanServer();
+ static {
try {
- objectName = new ObjectName(OF_RECONC_BEANNAME);
- registerReconciliationMbean(reconciliationJMXService);
+ OF_RECONF_OBJNAME = new ObjectName("org.opendaylight.openflowplugin.frm:type=ReconciliationState");
} catch (MalformedObjectNameException e) {
- LOG.error("ObjectName instance creation failed for Mbean {} : ", OF_RECONC_BEANNAME, e);
+ throw new ExceptionInInitializerError(e);
}
}
- public void registerReconciliationMbean(ReconciliationJMXService reconciliationJMXService) {
- try {
- // Uniquely identify the MBeans and register them with the platform MBeanServer
- if (!mbs.isRegistered(objectName)) {
- mbs.registerMBean(reconciliationJMXService, objectName);
- LOG.debug("Registered Mbean {} successfully", OF_RECONC_BEANNAME);
+ private final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+ private ObjectInstance objInstance;
+
+ @Inject
+ @Activate
+ public ReconciliationJMXAgent(@Reference final ReconciliationJMXServiceMBean reconciliationJMXService) {
+ // Uniquely identify the MBeans and register them with the platform MBeanServer
+ ObjectInstance inst = null;
+ if (!mbs.isRegistered(OF_RECONF_OBJNAME)) {
+ try {
+ inst = mbs.registerMBean(reconciliationJMXService, OF_RECONF_OBJNAME);
+ LOG.debug("Registered Mbean {} successfully", OF_RECONF_OBJNAME);
+ } catch (InstanceAlreadyExistsException | MBeanRegistrationException | NotCompliantMBeanException e) {
+ LOG.warn("Registeration failed for Mbean {} : ", OF_RECONF_OBJNAME , e);
+ }
+ }
+ objInstance = inst;
+ }
+
+ @PreDestroy
+ @Deactivate
+ @Override
+ public void close() {
+ if (objInstance != null) {
+ objInstance = null;
+ try {
+ mbs.unregisterMBean(OF_RECONF_OBJNAME);
+ } catch (MBeanRegistrationException | InstanceNotFoundException e) {
+ LOG.warn("Unregistration failed for Mbean {} : ", OF_RECONF_OBJNAME , e);
}
- } catch (MBeanRegistrationException | InstanceAlreadyExistsException | NotCompliantMBeanException e) {
- LOG.error("Registeration failed for Mbean {} : ", OF_RECONC_BEANNAME , e);
}
}
}