/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under The MIT license. */ package com.ttProject.jmx; import java.lang.management.ManagementFactory; import javax.management.MBeanServer; import javax.management.MBeanServerFactory; import javax.management.ObjectName; import org.apache.log4j.Logger; import com.ttProject.jmx.bean.IMXBeanBase; import com.ttProject.jmx.bean.MXBeanBase; /** * control jmx task. * @author taktod */ public class JMXFactory { private static Logger logger = Logger.getLogger(JMXFactory.class); /** work domain */ private static String domain = "com.ttProject:type="; /** bean server */ private static MBeanServer beanServer; /** * static initialize */ static { try { setMBeanServer(MBeanServerFactory.findMBeanServer(null).get(0)); } catch (Exception e) { setMBeanServer(ManagementFactory.getPlatformMBeanServer()); } } /** * register MBeanServer * @param beanServer */ public static void setMBeanServer(MBeanServer beanServer) { JMXFactory.beanServer = beanServer; } /** * MBeanServer * @return */ public static MBeanServer getMBeanServer() { return JMXFactory.beanServer; } /** * register domain name * @param domain */ public static void setDomain(String domain) { JMXFactory.domain = domain; } /** * domain name * @return */ public static String getDomain() { return JMXFactory.domain; } /** * register jmx object * @param type * @param obj * @return */ public static ObjectName registerMBean(String type, IMXBeanBase obj) { return registerMBean(type, obj, new String[]{}); } /** * register jmx object * @param type * @param obj * @param paths * @return */ public static ObjectName registerMBean(String type, IMXBeanBase obj, String[] paths) { try { StringBuilder objectNameStr = new StringBuilder(domain); objectNameStr.append(type); int i = 0; for(String path : paths) { objectNameStr.append(","); objectNameStr.append(i); objectNameStr.append("="); objectNameStr.append(path); i ++; } ObjectName objectName = new ObjectName(objectNameStr.toString()); return registerMBean(obj, objectName); } catch (Exception e) { logger.error("Could not register the " + obj.getClass().getName(), e); return null; } } /** * register jmx object * @param obj * @param objectName * @return */ public static ObjectName registerMBean(IMXBeanBase obj, ObjectName objectName) { try { // re-register for same name. if(beanServer.isRegistered(objectName)) { beanServer.unregisterMBean(objectName); } beanServer.registerMBean(obj, objectName); if(obj instanceof MXBeanBase) { ((MXBeanBase)obj).setObjectName(objectName); } return objectName; } catch (Exception e) { logger.error("Could not register the MXBean", e); return null; } } /** * unregister jmx object * @param type * @param paths */ public static void unregisterMBean(String type, String[] paths) { try { StringBuilder objectNameStr = new StringBuilder(domain); int i = 0; for(String path : paths) { objectNameStr.append(","); objectNameStr.append(i); objectNameStr.append("="); objectNameStr.append(path); i ++; } ObjectName objectName = new ObjectName(objectNameStr.toString()); unregisterMBean(objectName); } catch (Exception e) { logger.error("Could not unregister the MXBean", e); } } /** * unregister jmx object * @param objectName */ public static void unregisterMBean(ObjectName objectName) { try { if(beanServer.isRegistered(objectName)) { beanServer.unregisterMBean(objectName); } } catch (Exception e) { logger.error("Could not unregister the MXBean", e); } } }