MinerQueue.java 访问队列

本文介绍了一种用于网络爬虫的队列管理系统,包括URL队列、待访问队列、等待提取URL的分析页面队列及存储队列,确保每个URL仅被访问一次,有效管理爬虫线程的数据交互。

MinerQueue.java 访问队列

package com.iteye.injavawetrust.miner;

import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 访问队列
 * 
 * @author InJavaWeTrust
 *
 */
public class MinerQueue {
	
	private static final Log LOG = LogFactory.getLog(MinerQueue.class);
	
	/**
	 * URL队列 保证每一个URL只访问一次
	 */
	private static volatile Set<String> urlSet = new HashSet<String>();
	/**
	 * 待访问队列<br>
	 * 爬取页面线程从这里取数据
	 */
	private static volatile Queue<MinerUrl> unVisited = new LinkedList<MinerUrl>();
	/**
	 * 等待提取URL的分析页面队列<br>
	 * 解析页面线程从这里取数据
	 */
	private static volatile Queue<Html> waitingMisering = new LinkedList<Html>();
	/**
	 * 存储队列<br>
	 * 存储线程从这里取数据
	 */
	private static volatile Queue<Html> store = new LinkedList<Html>();
	/**
	 * 添加到存储队列
	 * @param html 爬取页面
	 */
	public synchronized static void addStore(Html html) {
		store.add(html);
	}
	/**
	 * 存储队列出队列
	 * @return 爬取页面
	 */
	public synchronized static Html storePoll() {
		return store.poll();
	}
	/**
	 * 存储队列是否为空 
	 * @return
	 */
	public static boolean storeIsEmpty() {
		return store.isEmpty();
	}
	/**
	 * 添加到等待提取URL的分析页面队列
	 * @param html 
	 */
	public synchronized static void addWaitingMisering(Html html) {
		waitingMisering.add(html);
	}
	/**
	 * 等待提取URL的分析页面出队列
	 * @return
	 */
	public synchronized static Html waitingMiseringPoll() {
		return waitingMisering.poll();
	}
	/**
	 * 等待提取URL的分析页面队列大小 
	 * @return
	 */
	public static int waitingMiseringSize() {
		return waitingMisering.size();
	}
	/**
	 * 等待提取URL的分析页面队列是否为空
	 * @return true-空;false-非空
	 * @return
	 */
	public static boolean waitingMiseringIsEmpty(){
		return waitingMisering.isEmpty();
	}
	/**
	 * 添加到URL队列
	 * @param url
	 */
	public synchronized static void addUrlSet(String url) {
		urlSet.add(url);
	}
	/**
	 * 获得URL队列大小
	 * @return
	 */
	public static int getUrlSetSize() {
		return urlSet.size();
	}
	/**
	 * 得到待访问队列
	 * @return
	 */
	public static Queue<MinerUrl> getUnVisited() {
		return unVisited;
	}
	/**
	 * 待访问出队列
	 * @return
	 */
	public synchronized static MinerUrl unVisitedPoll() {
		return unVisited.poll();
	}
	/**
	 * 添加到待访问队列,每个URL只访问一次
	 * @param html
	 */
	public synchronized static void addUnVisited(MinerUrl minerUrl) {
		if(null != minerUrl && !urlSet.contains(minerUrl.getUrl())) {
			LOG.info("添加到待访问队列[" + minerUrl.getUrl() + "] 当前第[" + minerUrl.getDepth() + "]层 当前线程[" + Thread.currentThread().getName() + "]");
			unVisited.add(minerUrl);
		}
	}
	/**
	 * 判断待访问的队列是否为空
	 * @return true-空;false-非空
	 */
	public static boolean unVisitedIsEmpty() {
		return unVisited.isEmpty();
	}
	/**
	 * 待访问的队列大小 
	 * @return
	 */
	public static int unVisitedSize(){
		return unVisited.size();
	}

}

 

返回列表

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值