【发布时间】:2015-11-12 23:25:02
【问题描述】:
我正在使用 Java 下载其 URL 存储在数据库中的网站的 HTML 内容。我也想将他们的 HTML 放入数据库。
我为此使用Jsoup:
public String downloadHTML(String byLink) {
String htmlInPage = "";
try {
Document doc = Jsoup.connect(byLink).get();
htmlInPage = doc.html();
} catch (org.jsoup.UnsupportedMimeTypeException e) {
// process this and some other exceptions
}
return htmlInPage;
}
我想同时下载网站并使用此功能:
public void downloadURL(int websiteId, String url,
String categoryName, ExecutorService executorService) {
executorService.submit((Runnable) () -> {
String htmlInPage = downloadHTML(url);
System.out.println("Category: " + categoryName + " " + websiteId + " " + url);
String insertQuery =
"INSERT INTO html_data (website_id, html_contents) VALUES (?,?)";
dbUtils.query(insertQuery, websiteId, htmlInPage);
});
}
dbUtils 是我的基于 Apache Commons DbUtils 的课程。详情在这里:http://pastebin.com/iAKXchbQ
而且我正在以这样的方式使用上面提到的所有内容:(List<Object[]> 详细信息也在 pastebin 上进行了解释)
public static void main(String[] args) {
DbUtils dbUtils = new DbUtils("host", "db", "driver", "user", "pass");
List<String> categoriesList =
Arrays.asList("weapons", "planes", "cooking", "manga");
String sql = "SELECT lw.id, lw.website_url, category_name " +
"FROM list_of_websites AS lw JOIN list_of_categories AS lc " +
"ON lw.category_id = lc.id " +
"where category_name = ? ";
ExecutorService executorService = Executors.newFixedThreadPool(10);
for (String category : categoriesList) {
List<Object[]> sitesInCategory = dbUtils.select(sql, category );
for (Object[] entry : sitesInCategory) {
int websiteId = (int) entry[0];
String url = (String) entry[1];
String categoryName = (String) entry[2];
downloadURL(websiteId, url, categoryName, executorService);
}
}
executorService.shutdown();
}
我不确定这个解决方案是否正确,但它确实有效。现在我想修改代码以保存不是来自我数据库中所有网站的 HTML,而是只保存每个类别中的固定数量。
例如,从“武器”类别中下载并保存 50 个网站的 HTML,从“飞机”类别中下载 50 个等。我认为没有必要为此使用 sql:如果我们为每个类别选择 50 个网站,则它没有'这意味着我们将它们全部保存,因为可能存在不正确的语法和连接问题。
我尝试创建单独的类来实现Runnable 的字段:counter 和maxWebsitesPerCategory,但这些变量没有更新。另一个想法是创建字段Map<String,Integer> sitesInCategory 而不是counter,将每个类别作为键放在那里并增加其值直到达到maxWebsitesPerCategory,但它也不起作用。请帮我!
P.S:我也将感谢任何与我实现并发下载相关的建议(我之前没有在 Java 中使用过并发,这是我的第一次尝试)
【问题讨论】:
标签: java concurrency runnable executorservice java.util.concurrent