import org.slf4j.LoggerFactory;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
public class Monitor extends Thread implements Terminable {
private static final long PING_DELAY_MS = 3000L;
- private static final long TIMEOUT_MS = 15000L;
private final static Logger LOGGER = LoggerFactory.getLogger(Monitor.class);
private volatile List<ProcessWrapper> processes;
- private final Map<String, Long> pings;
private final ScheduledFuture<?> watch;
private final ScheduledExecutorService monitor;
public Monitor() {
super("Process Monitor");
processes = new ArrayList<ProcessWrapper>();
- pings = new ConcurrentHashMap<String, Long>();
monitor = Executors.newScheduledThreadPool(1);
watch = monitor.scheduleWithFixedDelay(new ProcessWatch(), 0L, PING_DELAY_MS, TimeUnit.MILLISECONDS);
}
try {
ProcessMXBean mBean = process.getProcessMXBean();
if (mBean != null) {
- long time = mBean.ping();
- pings.put(process.getName(), time);
+ mBean.ping();
}
} catch (Exception e) {
// fail to ping, do nothing
*/
public void registerProcess(ProcessWrapper process) throws InterruptedException {
processes.add(process);
- pings.put(process.getName(), System.currentTimeMillis());
// starts a monitoring thread
process.start();
}
- private boolean processIsValid(ProcessWrapper processWrapper) {
- if (ProcessUtils.isAlive(processWrapper.process())) {
- long now = System.currentTimeMillis();
- return now - pings.get(processWrapper.getName()) < TIMEOUT_MS;
- }
- return false;
- }
-
/**
* Check continuously that registered processes are still up. If any process is down or does not answer to pings
* during the max allowed period, then thread exits.
boolean ok = true;
while (ok) {
for (ProcessWrapper process : processes) {
- if (!processIsValid(process)) {
- LOGGER.info("{} is down, stopping processes", process.getName());
+ if (!ProcessUtils.isAlive(process.process())) {
+ LOGGER.info("{} is down, stopping all other processes", process.getName());
ok = false;
interrupt();
}
watch.cancel(true);
}
- for (int i=processes.size()-1 ; i>=0 ; i--) {
+ for (int i = processes.size() - 1; i >= 0; i--) {
processes.get(i).terminate();
}
processes.clear();