package com.meidusa.amoeba.heartbeat;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.DelayQueue;
import org.apache.log4j.Logger;
/**
*
* @author Struct
*
*/
public class HeartbeatManager {
static Logger logger = Logger.getLogger(HeartbeatManager.class);
protected static final BlockingQueue<HeartbeatDelayed> HEART_BEAT_QUEUE = new DelayQueue<HeartbeatDelayed>();
static {
new Thread() {
{
this.setDaemon(true);
this.setName("HeartbeatManagerThread");
}
public void run() {
HeartbeatDelayed delayed = null;
while (true) {
try {
delayed = HEART_BEAT_QUEUE.take();
Status status = delayed.doCheck();
if (logger.isDebugEnabled()) {
logger.debug("checked task taskName="+ delayed.getName() + " ,Status=" + status);
}
if (delayed.isCycle()) {
delayed.reset();
HeartbeatManager.addHeartbeat(delayed);
}else{
if (status == Status.INVALID) {
// delayed.setDelayedTime(5, TimeUnit.SECONDS);
delayed.reset();
HeartbeatManager.addHeartbeat(delayed);
}else{
delayed.cancel();
}
}
} catch (Exception e) {
logger.error("check task= " + delayed.getName() + " error");
}
}
}
}.start();
}
public static void addHeartbeat(HeartbeatDelayed delay) {
if (!HEART_BEAT_QUEUE.contains(delay)) {
HEART_BEAT_QUEUE.offer(delay);
}
}
public static void removeHeartbeat(HeartbeatDelayed delay) {
HEART_BEAT_QUEUE.remove(delay);
}
}