package guang.crawler.controller;
import guang.crawler.centerConfig.CenterConfig;
import guang.crawler.controller.webservice.WebServiceDaemon;
import java.io.IOException;
import java.util.Date;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
/**
* 监控中央配置器,根据manager的配置情况决定控制器的工作.
*
* @author sun
*
*/
public class ControllerManagerWatcher extends Thread implements Watcher {
/**
* 事件发生的时间
*/
private Date eventTime = new Date();
/**
* 当前类的单例对象
*/
private static ControllerManagerWatcher watcher;
public static ControllerManagerWatcher me() {
if (ControllerManagerWatcher.watcher == null) {
ControllerManagerWatcher.watcher = new ControllerManagerWatcher();
}
return ControllerManagerWatcher.watcher;
}
private ControllerManagerWatcher() {
this.setName("CONTROLLER-MANAGER-WATCHER");
}
/**
* 处理manager节点的事件
*/
@Override
public void process(final WatchedEvent event) {
// 应当持续不断的监控该事件,然后不断的处理
try {
CenterConfig.me()
.getControllerInfo()
.getControllerManagerInfo()
.watchNode(ControllerManagerWatcher.watcher);
} catch (Exception e) {
e.printStackTrace();
}
// 然后开始处理事件
switch (event.getType()) {
case NodeDeleted: // 之前的监控者已经退出了,那么想办法取代该节点
synchronized (this.eventTime) {
this.eventTime.setTime(System.currentTimeMillis());
this.eventTime.notifyAll();
}
break;
default:
break;
}
}
/**
* 系统的主线程.当控制器获得了manager节点的控制权之后,才开始真正进行调度工作.
*/
@Override
public void run() {
// 应当持续不断的监控该事件,然后不断的处理
try {
CenterConfig.me()
.getControllerInfo()
.getControllerManagerInfo()
.watchNode(ControllerManagerWatcher.watcher);
} catch (Exception e) {
e.printStackTrace();
}
while (true) {
boolean success = false;
try {
// 处理之前获取当前时间
Date now = new Date();
// 竞争controller角色
try {
success = CenterConfig.me()
.getControllerInfo()
.competeForController();
} catch (KeeperException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 如果竞争成功,那么启动控制器的工作线程,并发布web服务
if (success) {
ControllerWorkThread.me()
.start();
WebServiceDaemon.me()
.start();
}
// 检查在上面处理过程中有没有新的事件产生,如果没有,那么休眠,否则再次检查.
synchronized (this.eventTime) {
if (now.after(this.eventTime)) {
this.eventTime.wait();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
return;
} catch (IOException e) {
e.printStackTrace();
} catch (KeeperException e) {
return;
}
}
}
}