Mercurial > hg > release > thermostat-1.0
changeset 377:253b33b762b3
Clean listeners when shutting down
reviewed-by: omajid
review-thread: http://icedtea.classpath.org/pipermail/thermostat/2012-June/001842.html
author | Mario Torre <neugens.limasoftware@gmail.com> |
---|---|
date | Thu, 14 Jun 2012 22:06:19 +0200 |
parents | b84868793ef2 |
children | 3fad23440030 |
files | agent/core/src/main/java/com/redhat/thermostat/backend/system/JvmStatHostListener.java agent/core/src/main/java/com/redhat/thermostat/backend/system/SystemBackend.java |
diffstat | 2 files changed, 48 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/agent/core/src/main/java/com/redhat/thermostat/backend/system/JvmStatHostListener.java Thu Jun 14 22:06:19 2012 +0200 +++ b/agent/core/src/main/java/com/redhat/thermostat/backend/system/JvmStatHostListener.java Thu Jun 14 22:06:19 2012 +0200 @@ -42,6 +42,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArraySet; import java.util.logging.Level; import java.util.logging.Logger; @@ -52,6 +54,7 @@ import sun.jvmstat.monitor.VmIdentifier; import sun.jvmstat.monitor.event.HostEvent; import sun.jvmstat.monitor.event.HostListener; +import sun.jvmstat.monitor.event.VmListener; import sun.jvmstat.monitor.event.VmStatusChangeEvent; import com.redhat.thermostat.agent.JvmStatusListener; @@ -70,15 +73,29 @@ private final VmInfoDAO vmInfoDAO; private Map<Integer, MonitoredVm> monitoredVms = new HashMap<>(); - + private Map<MonitoredVm, List<VmListener>> registeredListeners = new ConcurrentHashMap<>(); + private Set<JvmStatusListener> statusListeners = new CopyOnWriteArraySet<JvmStatusListener>(); JvmStatHostListener(DAOFactory df, boolean attachNew) { this.df = df; this.vmInfoDAO = df.getVmInfoDAO(); - this.attachNew = attachNew; + this.attachNew = attachNew; } + void removeAllListeners() { + for (MonitoredVm vm : monitoredVms.values()) { + for (VmListener listener : registeredListeners.get(vm)) { + try { + if (listener != null) vm.removeVmListener(listener); + + } catch (MonitorException e) { + logger.log(Level.WARNING, "can't remove vm listener", e); + } + } + } + } + @Override public void disconnected(HostEvent event) { logger.warning("Disconnected from host"); @@ -139,8 +156,21 @@ } if (attachNew) { - vm.addVmListener(new JvmStatVmListener(df, vmId)); - vm.addVmListener(new JvmStatVmClassListener(df, vmId)); + List<VmListener> listeners = registeredListeners.get(vm); + if (listeners == null) { + listeners = new CopyOnWriteArrayList<>(); + } + + VmListener listener = new JvmStatVmListener(df, vmId); + vm.addVmListener(listener); + listeners.add(listener); + + listener = new JvmStatVmClassListener(df, vmId); + vm.addVmListener(listener); + listeners.add(listener); + + registeredListeners.put(vm, listeners); + } else { logger.log(Level.FINE, "skipping new vm " + vmId); } @@ -163,7 +193,16 @@ } vmInfoDAO.putVmStoppedTime(vmId, stopTime); - monitoredVms.remove(vmId).detach(); + MonitoredVm vm = monitoredVms.remove(vmId); + List<VmListener> listeners = registeredListeners.remove(vm); + for (VmListener listener : listeners) { + try { + if (listener != null) vm.removeVmListener(listener); + } catch (MonitorException e) { + logger.log(Level.WARNING, "can't remove vm listener", e); + } + } + vm.detach(); } }
--- a/agent/core/src/main/java/com/redhat/thermostat/backend/system/SystemBackend.java Thu Jun 14 22:06:19 2012 +0200 +++ b/agent/core/src/main/java/com/redhat/thermostat/backend/system/SystemBackend.java Thu Jun 14 22:06:19 2012 +0200 @@ -198,6 +198,10 @@ removeJvmStatusListener(this); try { + + // remove all listener from the host listener + hostListener.removeAllListeners(); + host.removeHostListener(hostListener); } catch (MonitorException me) { logger.log(Level.INFO, "something went wrong in jvmstat's listening to this host"); @@ -215,7 +219,6 @@ @Override public String getConfigurationValue(String key) { - // TODO Auto-generated method stub return null; }