package uk.ac.imperial.lsds.seepworker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.ac.imperial.lsds.seep.comm.Connection;
import uk.ac.imperial.lsds.seepworker.comm.ControlAPIImplementation;
import uk.ac.imperial.lsds.seepworker.core.Conductor;
public class WorkerShutdownHookWorker implements Runnable {
final private static Logger LOG = LoggerFactory.getLogger(WorkerShutdownHookWorker.class);
private final int workerId;
private Conductor c;
private Connection masterConn;
private ControlAPIImplementation api;
public WorkerShutdownHookWorker(int workerId, Conductor c, Connection masterConn, ControlAPIImplementation api) {
this.workerId = workerId;
this.c = c;
this.masterConn = masterConn;
this.api = api;
}
@Override
public void run() {
// Start emergency thread, in case the shutdown hook gets deadlocked with some resource
this.emergencyHook();
LOG.info("JVM is shutting down...");
LOG.info("Worker is shutting down, sending bye message");
String reason = "unknown";
api.signalDeadWorker(masterConn, workerId, reason);
c.stopProcessing();
LOG.info("bye");
}
private void emergencyHook(){
new Thread( new Runnable(){
public void run(){
try {
// Wait 5 seconds, then kill the JVM
synchronized(this) {
Thread.currentThread().wait(5000);
}
Runtime.getRuntime().halt(0);
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
}