package org.ourgrid.worker.business.requester;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.ourgrid.common.internal.IResponseTO;
import org.ourgrid.worker.business.controller.IdlenessDetectorController;
import org.ourgrid.worker.business.dao.IdlenessDetectorDAO;
import org.ourgrid.worker.business.dao.WorkerDAOFactory;
import org.ourgrid.worker.request.LinuxIdlenessDetectorActionRequestTO;
public class LinuxDevInputIdlenessDetectorActionRequester
extends
AbstractScheduledIdlenessDetectorActionRequester<LinuxIdlenessDetectorActionRequestTO> {
private static final String IDLENESS_CMD_LOCATION = "/usr/share/ourgrid/idleness";
private boolean isIdle = false;
private ExecutorService threadPool;
private void checkIdle() {
IdlenessDetectorDAO idlenessDetectorDAO = WorkerDAOFactory
.getInstance().getIdlenessDetectorDAO();
Long idlenessTime = idlenessDetectorDAO.getIdlenessTime() / 1000;
while (true) {
try {
ProcessBuilder pb = new ProcessBuilder(IDLENESS_CMD_LOCATION,
idlenessTime.toString());
int exitValue = pb.start().waitFor();
isIdle = exitValue == 1;
} catch (Exception e) {
} finally {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {}
}
}
}
@Override
public List<IResponseTO> execute(
LinuxIdlenessDetectorActionRequestTO request) {
IdlenessDetectorDAO idlenessDetectorDAO = WorkerDAOFactory.getInstance().getIdlenessDetectorDAO();
if (threadPool == null && idlenessDetectorDAO.isActive()) {
threadPool = Executors.newFixedThreadPool(1);
threadPool.execute(new Runnable() {
@Override
public void run() {
checkIdle();
}
});
}
List<IResponseTO> responses = new ArrayList<IResponseTO>();
if (isIdleNow()) {
IdlenessDetectorController.getInstance().resumeWorker(responses);
} else {
IdlenessDetectorController.getInstance().pauseWorker(responses);
}
return responses;
}
private boolean isIdleNow() {
IdlenessDetectorDAO idlenessDetectorDAO = WorkerDAOFactory.getInstance().getIdlenessDetectorDAO();
boolean isScheduledToBeIdle = super.isIdle();
if (!idlenessDetectorDAO.isActive()) {
return isScheduledToBeIdle;
}
return isIdle;
}
}