416990 JMX names statically unique

Concurrent access to counter
This commit is contained in:
Greg Wilkins 2013-09-12 12:52:28 +10:00
parent 4d1c7ed28d
commit 423dc1e443
2 changed files with 20 additions and 6 deletions

View File

@ -23,6 +23,9 @@ import java.util.HashMap;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.WeakHashMap; import java.util.WeakHashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicInteger;
import javax.management.InstanceNotFoundException; import javax.management.InstanceNotFoundException;
import javax.management.MBeanRegistrationException; import javax.management.MBeanRegistrationException;
@ -42,7 +45,12 @@ import org.eclipse.jetty.util.log.Logger;
public class MBeanContainer implements Container.InheritedListener, Dumpable public class MBeanContainer implements Container.InheritedListener, Dumpable
{ {
private final static Logger LOG = Log.getLogger(MBeanContainer.class.getName()); private final static Logger LOG = Log.getLogger(MBeanContainer.class.getName());
private final static HashMap<String, Integer> _unique = new HashMap<String, Integer>(); private final static ConcurrentMap<String, AtomicInteger> __unique = new ConcurrentHashMap<String, AtomicInteger>();
public static void resetUnique()
{
__unique.clear();
}
private final MBeanServer _mbeanServer; private final MBeanServer _mbeanServer;
private final WeakHashMap<Object, ObjectName> _beans = new WeakHashMap<Object, ObjectName>(); private final WeakHashMap<Object, ObjectName> _beans = new WeakHashMap<Object, ObjectName>();
@ -186,11 +194,16 @@ public class MBeanContainer implements Container.InheritedListener, Dumpable
buf.append(",").append("name=").append(name); buf.append(",").append("name=").append(name);
String basis = buf.toString(); String basis = buf.toString();
Integer count = _unique.get(basis);
count = count == null ? 0 : 1 + count;
_unique.put(basis, count);
oname = ObjectName.getInstance(domain + ":" + basis + ",id=" + count); AtomicInteger count = __unique.get(basis);
if (count==null)
{
count=__unique.putIfAbsent(basis,new AtomicInteger());
if (count==null)
count=__unique.get(basis);
}
oname = ObjectName.getInstance(domain + ":" + basis + ",id=" + count.getAndIncrement());
} }
ObjectInstance oinstance = _mbeanServer.registerMBean(mbean, oname); ObjectInstance oinstance = _mbeanServer.registerMBean(mbean, oname);

View File

@ -98,6 +98,7 @@ public class AttrEventTriggerTest
_handler = new TestHandler(); _handler = new TestHandler();
_server.setHandler(_handler); _server.setHandler(_handler);
MBeanContainer.resetUnique();
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
_mBeanContainer = new MBeanContainer(mBeanServer); _mBeanContainer = new MBeanContainer(mBeanServer);
_server.addBean(_mBeanContainer,true); _server.addBean(_mBeanContainer,true);