+ return getSameNames(getMBeanServer().queryNames(name, query));
+ }
+
+ abstract MBeanServer getMBeanServer();
+
+ synchronized void removeChild(final InternalJMXRegistrator child) {
+ children.remove(child);
+ }
+
+ private synchronized void internalClose() {
+ // close all children
+ for (InternalJMXRegistrator child : children) {
+ // This bypasses the call to removeChild(), preventing a potential deadlock when children are being closed
+ // concurrently
+ child.internalClose();
+ }
+ children.clear();
+
+ // close registered ONs
+ for (ObjectName on : registeredObjectNames) {
+ try {
+ getMBeanServer().unregisterMBean(on);
+ } catch (final Exception e) {
+ LOG.warn("Ignoring error while unregistering {}", on, e);
+ }
+ }
+ registeredObjectNames.clear();