Вы можете добавить их в существующий URLPool.Существующие реализации URLPool не могут быть расширены, поэтому вы должны создать свой собственный класс URLPool, который можно расширять.Я позвонил в мой класс ExpandableURLPool.
Метод URLPool.setProcessed вызывается платформой после завершения обработки, и там вы можете добавить дополнительные URL-адреса в список URL-адресов.Я приведу пример, но сначала документация URLPool гласит:
setProcessed (Query) вызывается искателем, чтобы сообщить URLPool, когда запрос был просканирован и его ресурс обработан.Обычно это используется URLPool для проверки статуса сканирования и регистрации ошибки в случае сбоя или для получения большего количества URL для сканирования в случае успеха.Типичный пример, когда getNextQuery () возвращает значение null, а hasNextQuery () возвращает значение true, - это когда URLPool ожидает некоторых обработанных ресурсов, из которых было извлечено больше URL для сканирования, чтобы вернуться.Проверьте пакет urlpools для примеров реализации.
Это означает, что сложная часть вашей реализации ExapndableURLPool заключается в том, что метод hasNextQuery должен возвращать значение true, если обрабатывается невыполненный запрос, который МОЖЕТ привести к добавлению новых URL в пул.Точно так же, getNextQuery должен возвращать значение NULL в тех случаях, когда существует невыполненный запрос, который еще не завершен и МОЖЕТ привести к добавлению новых URL в пул.[Мне не нравится, как niocchi соединяется в этом отношении]
Вот моя очень предварительная версия ExpandableURLPool:
class ExpandableURLPool implements URLPool {
List<String> urlList = new ArrayList<String>();
int cursor = 0;
int outstandingQueryies = 0;
public ExpandableURLPool(Collection<String> seedURLS) {
urlList.addAll(seedURLS);
}
@Override
public boolean hasNextQuery() {
return cursor < urlList.size() || outstandingQueryies > 0;
}
@Override
public Query getNextQuery() throws URLPoolException {
try {
if (cursor >= urlList.size()) {
return null;
} else {
outstandingQueryies++;
return new Query( urlList.get(cursor++) ) ;
}
} catch (MalformedURLException e) {
throw new URLPoolException( "invalid url", e ) ;
}
}
@Override
public void setProcessed(Query query) {
outstandingQueryies--;
}
public void addURL(String url) {
urlList.add(url);
}
}
Я также создал класс Worker, производный от DiskSaveWorker для тестированиявышеуказанная реализация:
class MyWorker extends org.niocchi.gc.DiskSaveWorker {
Crawler mCrawler = null;
ExpandableURLPool pool = null;
int maxepansion = 10;
public MyWorker(Crawler crawler, String savePath, ExpandableURLPool aPool) {
super(crawler, savePath);
mCrawler = crawler;
pool = aPool;
}
@Override
public void processResource(Query query) {
super.processResource(query);
// The following is a test
if (--maxepansion >= 0 ) {
pool.addURL("http://www.somewhere.com");
}
}
}