package com.dgrid.driver;
import java.util.concurrent.TimeUnit;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import com.dgrid.joblets.HostFactRunnable;
import com.dgrid.service.DGridExecutorService;
import com.dgrid.service.DGridProcessor;
public class Worker extends BaseDgridDriver {
private static Log log = LogFactory.getLog(Worker.class);
public static void main(String[] args) throws Exception {
log.trace("main()");
writePidFile();
AbstractApplicationContext ctx = getContext();
DGridProcessor driver = (DGridProcessor) ctx
.getBean(DGridProcessor.NAME);
Runtime.getRuntime().addShutdownHook(new ShutdownHook(driver));
driver.init();
provisionFactRunnable(ctx);
Thread t = new Thread(driver);
t.start();
}
/*
* Set host facts every 10 minutes
*/
private static void provisionFactRunnable(ApplicationContext ctx)
throws Exception {
log.trace("provisionFactRunnable()");
DGridExecutorService executor = (DGridExecutorService) ctx
.getBean(DGridExecutorService.NAME);
executor.scheduleAtFixedRate(new HostFactRunnable(ctx), 0l, 5l,
TimeUnit.MINUTES);
}
private static class ShutdownHook extends Thread {
DGridProcessor driver;
ShutdownHook(DGridProcessor driver) {
this.driver = driver;
}
public void run() {
log.trace("run()");
// execute in new thread
Thread t = new Thread() {
public void run() {
driver.stop();
}
};
t.start();
}
}
private static void writePidFile() {
try {
PidFileWriter pid = new PidFileWriter();
pid.writePidFile();
} catch (Exception e) {
log.warn("Unable to write pid:", e);
}
}
}