摘要:先上一張架構圖的事件傳遞的主要通過通道也就是圖中的這三個是阻塞隊列。
先上一張架構圖
spiderman2的事件傳遞的主要通過queue通道也就是圖中的DQ,EQ,RQ;這三個是阻塞隊列。Worker來消費隊列,Manager來處理任務流向哪個隊列
public static void main(String[] args) { final String xml = "xiaomibbs.xml"; final Config conf = new XMLConfBuilder(xml).build();// 解析xml配置文件通過XMLBuilder構建CONF對象 new Spiderman(conf).go();//啟動,別忘記看控制臺信息哦,結束之后會有統計信息的 }
創建一個Spiderman
public Spiderman(Config config) {//將配置文件初始化到上下文 this.context = new Context(config); final Properties params = context.getParams(); this.scheduler = Executors.newSingleThreadScheduledExecutor(); this.managers = context.getManagers(); this.managers.forEach(m -> { m.addListener(() -> { counter.plus(); }); }); this.threads = Executors.newFixedThreadPool(managers.size()); duration = K.convertToMillis(params.getString("duration", "0")).longValue(); counter = new Counter(managers.size(), duration); }
開始執行抓取
public Spiderman go() { logger.debug("開始行動..."); // 啟動各個工頭,啟動所有的downloadWorker,extractWorker,resultWorker,開始等待阻塞隊列的數據 this.managers.forEach(m -> threads.execute(m)); // 調度, 固定一段時間清除種子和一些中間過程任務,重新將種子放入任務隊列 final InitialSeeds initSeeds = new InitialSeeds(); final String cron = context.getParams().getString("scheduler.cron"); if (K.isNotBlank(cron)) { // quartz } else { final long period = K.convertToMillis(context.getParams().getString("scheduler.period", "0")).longValue(); if (period > 0) { this.scheduler.scheduleAtFixedRate(initSeeds, 5000, period, TimeUnit.MILLISECONDS); } else { //開始處理種子請求,將種子請求初始化成DownloadTask對象并塞到DQ initSeeds.execute(); } } Thread thread = new Thread(() -> { // 阻塞等待計數器歸0 try { this.counter.await(); } finally { if (this.counter.isTimeout()) { // 若是超時退出,先關閉manager logger.warn("運行時間["+this.counter.getCost()+"]已經達到或超過設置的最大運行時間[duration="+this.duration+"],將強行停止行動"); this.stop(); } else { logger.warn("當前采集的結果數["+this.counter.get()+"]已經達到或超過設置的最大數量[worker.result.limit="+this.counter.getLimit()+"],將強行停止行動"); } this._stop(); } }); thread.start(); return this; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69200.html
摘要:在學習源碼的過程中,給我幫助最大的就是這個系列文章,于是決定基于這個系列文章談一下自己的理解。到此為止,首次渲染就完成啦總結從啟動到元素渲染到頁面,并不像看起來這么簡單,中間經歷了復雜的層級調用。 前言 React 是一個十分龐大的庫,由于要同時考慮 ReactDom 和 ReactNative ,還有服務器渲染等,導致其代碼抽象化程度很高,嵌套層級非常深,閱讀其源碼是一個非常艱辛的過...
摘要:依賴注入和控制反轉,這兩個詞經常一起出現。一句話表述他們之間的關系依賴注入是控制反轉的一種實現方式。而兩者有大量的代碼都是可以共享的,這就是依賴注入的使用場景了。下一步就是創建具體的依賴內容,然后注入到需要的地方這里的等于這個對象。 前言 React 是一個十分龐大的庫,由于要同時考慮 ReactDom 和 ReactNative ,還有服務器渲染等,導致其代碼抽象化程度很高,嵌套層級...
前言 本文所有內容全部發布再個人博客主頁 https://github.com/muwoo/blogs歡迎訂閱。不過最近因為事情比較多,有一段時間沒有更新了,后面打算繼續不斷學習更新,歡迎小伙伴一起溝通交流~ 最近更新 前端單測的那些事 基于virtual dom 的canvas渲染 js Event loop 機制簡介 axios 核心源碼實現原理 JS 數據類型、賦值、深拷貝和淺拷貝 j...
前言 本文所有內容全部發布再個人博客主頁 https://github.com/muwoo/blogs歡迎訂閱。不過最近因為事情比較多,有一段時間沒有更新了,后面打算繼續不斷學習更新,歡迎小伙伴一起溝通交流~ 最近更新 前端單測的那些事 基于virtual dom 的canvas渲染 js Event loop 機制簡介 axios 核心源碼實現原理 JS 數據類型、賦值、深拷貝和淺拷貝 j...
前言 本文所有內容全部發布再個人博客主頁 https://github.com/muwoo/blogs歡迎訂閱。不過最近因為事情比較多,有一段時間沒有更新了,后面打算繼續不斷學習更新,歡迎小伙伴一起溝通交流~ 最近更新 前端單測的那些事 基于virtual dom 的canvas渲染 js Event loop 機制簡介 axios 核心源碼實現原理 JS 數據類型、賦值、深拷貝和淺拷貝 j...
閱讀 1682·2019-08-30 15:54
閱讀 3332·2019-08-26 17:15
閱讀 3522·2019-08-26 13:49
閱讀 2582·2019-08-26 13:38
閱讀 2291·2019-08-26 12:08
閱讀 3035·2019-08-26 10:41
閱讀 1369·2019-08-26 10:24
閱讀 3376·2019-08-23 18:35