package guang.crawler.siteManager.daemon; import guang.crawler.centerConfig.CenterConfig; import guang.crawler.centerConfig.siteManagers.SiteManagerInfo; import guang.crawler.centerConfig.sitesConfig.SitesConfigInfo; import guang.crawler.siteManager.SiteConfig; import guang.crawler.siteManager.SiteManager; import java.io.IOException; import java.util.Date; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; /** * 监控中央配置中自己节点的信息,并根据这些信息决定自己的工作。 * * @author sun * */ public class SiteManagerWatcherDaemon implements Watcher, Runnable { /** * 事件发生的时间 */ private Date eventTime = new Date(); public SiteManagerWatcherDaemon() { // TODO Auto-generated constructor stub } /** * 处理事件 */ @Override public void process(final WatchedEvent event) { // 首先,立即注册一个事件监听 SiteManagerInfo siteManagerInfo = SiteConfig.me() .getSiteManagerInfo(); try { siteManagerInfo.watchNode(this); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } if (event.getType() == Watcher.Event.EventType.NodeDataChanged) { // 如果节点信息更改了 try { siteManagerInfo.load(); synchronized (this.eventTime) { this.eventTime.setTime(System.currentTimeMillis()); this.eventTime.notifyAll(); } } catch (InterruptedException e) { return; } catch (IOException e) { return; } } } @Override public void run() { // 首先,立即注册一个事件监听 SiteConfig siteConfig = SiteConfig.me(); SiteManagerInfo siteManagerInfo = siteConfig.getSiteManagerInfo(); try { siteManagerInfo.watchNode(this); } catch (Exception e) { e.printStackTrace(); return; } SitesConfigInfo sitesConfigInfo; try { sitesConfigInfo = CenterConfig.me() .getSitesConfigInfo(); } catch (Exception e) { e.printStackTrace(); return; } while (true) { Date now = new Date(); try { siteManagerInfo.load(); } catch (Exception e) { e.printStackTrace(); return; } boolean dispatched = siteManagerInfo.isDispatched(); String siteToHandle = siteManagerInfo.getSiteToHandle(); // 判断是否需要停止 if (siteConfig.isDispatched() && ((!dispatched) || (!siteToHandle.equals(siteConfig.getSiteToHandle() .getSiteId())))) { // 这种情况需要关闭当前已经运行的站点管理器 SiteManager.me() .stopGathering(); siteConfig.setDispatched(false); try { CenterConfig.me() .getWorkersInfo() .getOnlineWorkers() .notifyChanged(); } catch (Exception e) { e.printStackTrace(); // this should not happen } } // 判断是否需要开启 if (dispatched && (!siteConfig.isDispatched())) { // 如果需要启动,而当前没有启动,那么启动之 // 然后使用新的配置 try { siteConfig.setSiteToHandle(sitesConfigInfo.getSitesInfo() .getSite(siteManagerInfo.getSiteToHandle())); } catch (Exception e) { e.printStackTrace(); return; } // 使用新的配置启动系统 try { SiteManager.me() .startGathering(); } catch (Exception e) { e.printStackTrace(); return; } siteConfig.setDispatched(true); try { CenterConfig.me() .getWorkersInfo() .getOnlineWorkers() .notifyChanged(); } catch (Exception e) { e.printStackTrace(); // this should not happen } } synchronized (this.eventTime) { if (now.after(this.eventTime)) { try { this.eventTime.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); return; } } } } } }