package beans.tasks;
import akka.util.Duration;
import models.ServerNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import play.libs.Akka;
import server.ServerPool;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* Created with IntelliJ IDEA.
* User: guym
* Date: 8/22/13
* Time: 3:06 PM
*
*
* This task runs periodically and finds server we need to destroy.
* Currently we are also using it to make sure the server pool is in good shape - meaning we have enough servers.
*
*
*/
public class DestroyServersTaskImpl implements DestroyServersTask {
private static Logger logger = LoggerFactory.getLogger(DestroyServersTaskImpl.class);
@Autowired private ServerPool serverPool;
@Override
public void run() {
logger.debug("running DestroyServersTaskImpl");
List<ServerNode> all = ServerNode.findByCriteria( new ServerNode.QueryConf().criteria().setRemote(false).done() );
for (ServerNode serverNode : all) {
logger.debug("checking to see if server [{}] expired", serverNode.toDebugString());
if (serverNode.isExpired()) {
DestroySingleServerTask task = new DestroySingleServerTask().setServerNode(serverNode).setServerPool(serverPool);
Akka.system().scheduler().scheduleOnce(Duration.create(0, TimeUnit.MILLISECONDS), task);
} else {
logger.debug("not expired, timeleft is : " + serverNode.getTimeLeft());
}
}
serverPool.runHealthCheck();
}
public void setServerPool(ServerPool serverPool) {
this.serverPool = serverPool;
}
public static class DestroySingleServerTask implements Runnable{
private ServerNode serverNode;
private ServerPool serverPool;
@Override
public void run() {
try{
if (serverNode == null ){
logger.info("DestroySingleServerTask got a NULL serverNode!", new RuntimeException());
return;
}
if ( serverPool == null ){
throw new RuntimeException("must have a serverPool");
}
if ( serverNode.getNodeId() == null) { // possible if remote bootstrap that failed for some reason.
serverNode.delete();
}
try {
logger.info("destroying [{}]", serverNode );
serverPool.destroy(serverNode);
} catch (Exception e) {
logger.error("destroying server threw exception", e);
}
}catch(Exception e){
logger.error("unable to run DestroySingleServerTask", e);
}
}
public DestroySingleServerTask setServerNode( ServerNode serverNode ){
this.serverNode = serverNode;
return this;
}
public DestroySingleServerTask setServerPool(ServerPool serverPool) {
this.serverPool = serverPool;
return this;
}
}
}