package guang.crawler.launcher; import guang.crawler.centerConfig.CenterConfig; import guang.crawler.controller.CrawlerController; import guang.crawler.crawlWorker.CrawlerWorker; import guang.crawler.siteManager.SiteManager; import java.io.IOException; /** * 爬虫的启动器,用来启动整个爬虫系统 * * @author sun * */ public class CrawlerLauncher { /** * 站点管理器角色常量 */ private static final String ROLE_SITE = "site"; /** * 爬虫工作者角色常量 */ private static final String ROLE_WORKER = "worker"; /** * 控制器角色常量 */ private static final String ROLE_CONTROLLER = "controller"; private static CrawlerLauncher crawlerLauncher; public static CrawlerLauncher me() { if (CrawlerLauncher.crawlerLauncher == null) { CrawlerLauncher.crawlerLauncher = new CrawlerLauncher(); } return CrawlerLauncher.crawlerLauncher; } private CrawlerLauncher() { } /** * 初始化爬虫启动器 * * @return * @throws IOException * @throws InterruptedException */ public CrawlerLauncher init() throws IOException, InterruptedException { LauncherConfig launcherConfig = LauncherConfig.me() .init(); CenterConfig.me() .init(launcherConfig.getZookeeperQuorum()); return this; } /** * 根据配置的角色加载各个角色 * * @throws InterruptedException */ public void launch() throws InterruptedException { String[] roles = LauncherConfig.me() .getRoles(); for (String role : roles) { if (CrawlerLauncher.ROLE_WORKER.equalsIgnoreCase(role)) { this.launchWorker(); } else if (CrawlerLauncher.ROLE_SITE.equalsIgnoreCase(role)) { this.launchSiteManager(); } else if (CrawlerLauncher.ROLE_CONTROLLER.equalsIgnoreCase(role)) { this.launchController(); } } } /** * 在一个单独的线程中启动控制器 * * @throws InterruptedException */ private void launchController() throws InterruptedException { new Thread() { @Override public void run() { try { CrawlerController.me() .init() .start(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }.start(); } /** * 在一个单独的线程中启动站点管理器 */ private void launchSiteManager() { // 这里启动站点管理器 new Thread() { @Override public void run() { try { SiteManager.me() .init() .start(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }.start(); } /** * 在一个单独的线程中启动爬虫工作者 */ private void launchWorker() { // 这里启动爬虫工作者 new Thread() { @Override public void run() { try { CrawlerWorker.me() .init() .start(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }.start(); } }