package cz.cuni.mff.d3s.been.detectors;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import cz.cuni.mff.d3s.been.core.ri.MonitorSample;
import cz.cuni.mff.d3s.been.util.PropertyReader;
/**
*
* Periodic monitoring sample generator.
*
* @author Kuba Brecka
*/
public class Monitoring {
private static final Logger log = LoggerFactory.getLogger(Monitoring.class);
private int monitorInterval = MonitoringConfiguration.DEFAULT_INTERVAL;
private volatile boolean monitoringRunning = false;
private Thread monitoringThread;
private Set<MonitoringListener> listeners = new HashSet();
/**
* Creates new Monitoring sample generator.
*
* @param properties
* monitoring settings
*/
public Monitoring(Properties properties) {
PropertyReader propertyReader = PropertyReader.on(properties);
Integer interval = propertyReader.getInteger(
MonitoringConfiguration.INTERVAL,
MonitoringConfiguration.DEFAULT_INTERVAL);
setMonitoringInterval(interval);
}
/**
* Adds monitoring listener.
*
* Every time a sample is generated, the event will be propagated to all
* listeners.
*
* @param listener
* the listener to add
*/
public void addListener(MonitoringListener listener) {
listeners.add(listener);
}
private void setMonitoringInterval(int milliseconds) {
if (milliseconds < 10) {
milliseconds = 10;
}
monitorInterval = milliseconds;
}
/**
* Starts periodically generating monitoring samples.
*/
public synchronized void startMonitoring() {
if (monitoringRunning)
return;
monitoringRunning = true;
monitoringThread = new Thread() {
@Override
public void run() {
Detector detector = new Detector();
try {
while (monitoringRunning) {
MonitorSample sample = detector.generateSample(true);
for (MonitoringListener listener : listeners) {
listener.sampleGenerated(sample);
}
try {
Thread.sleep(monitorInterval);
} catch (InterruptedException e) {
// do nothing
}
}
} catch (Exception e) {
log.error("Monitoring failed", e);
} finally {
for (MonitoringListener listener : listeners) {
listener.close();
}
}
}
};
monitoringThread.start();
}
/**
* Stops generation of monitoring samples.
*/
public synchronized void stopMonitoring() {
monitoringRunning = false;
monitoringThread.interrupt();
try {
monitoringThread.join();
} catch (InterruptedException e) {
// do nothing
}
}
}