package com.tacitknowledge.slowlight.proxyserver.handler;
import com.netflix.config.jmx.BaseConfigMBean;
import com.netflix.config.jmx.ConfigMBean;
import com.tacitknowledge.slowlight.proxyserver.config.HandlerConfig;
import org.apache.commons.configuration.AbstractConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.StandardMBean;
import java.lang.management.ManagementFactory;
/**
* Config manager provides methods to expose handler parameters via JMX as dynamic configuration,
* this will allow someone to adjust parameters values at runtime when needed.
*
* @author Alexandr Donciu (adonciu@tacitknowledge.com)
*/
public class HandlerConfigManager
{
private static final Logger LOG = LoggerFactory.getLogger(HandlerConfigManager.class);
/**
* Registers specified handler configuration (parameters) as JMX MBean.
*
* @param handlerConfig handler configuration
* @param config handler parameters
* @return configuration MBean
*/
public static ConfigMBean registerConfigMBean(final HandlerConfig handlerConfig, final AbstractConfiguration config)
{
StandardMBean mbean;
ConfigMBean bean;
try
{
MBeanServer mbs = getMBeanServer();
bean = new BaseConfigMBean(config);
mbean = new StandardMBean(bean, ConfigMBean.class);
final ObjectName objectName = getJMXObjectName(handlerConfig);
if (mbs.isRegistered(objectName))
{
LOG.warn("Skip Config MBean registration because there is one registered with the same name [{}]", objectName);
return null;
}
mbs.registerMBean(mbean, objectName);
}
catch (Exception e)
{
throw new RuntimeException(e);
}
return bean;
}
protected static MBeanServer getMBeanServer()
{
return ManagementFactory.getPlatformMBeanServer();
}
protected static ObjectName getJMXObjectName(final HandlerConfig handlerConfig)
{
try
{
return new ObjectName("slowlight-config" + ":class=" + handlerConfig.getName());
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
}