日期:2014-05-20  浏览次数:20617 次

当JAVA WEB服务器端有一个执行时间长的方法,应该如何处理?
背景:开发一个web版的爬虫系统,没用heritrix,nutch等开源框架,采用的是jsp+servlet。

目标:根据指定网址和关键词,爬出与关键词相关的链接还有内容,并将与关键词相关的那部分文本和url存到数据库当中(已使用jsoup除去html标记和js,css之类的,只存文本)。
用户jsp页面输入url,keywords提交post请求,服务器端servlet调用爬虫方法crawer()。

想达到的效果:
1.客户端可以实时观察查询结果,并能暂停或停止该任务。
2.客户端建立任务,这些任务可以定时运行或以排队运行。

开发中遇到的问题:
crawer()方法执行时间很长,而且有请求网址的操作。
如果把该方法放在doPost()中,会发生提交后无法进行其他的操作,
如果以线程的方式启动这个方法,又会发生线程不安全的状况,也就是说这期间有人进行
请求执行了crawer()方法,结果会比较混乱,而servlet本身并非线程安全的。

1.的效果很难达到,暂时的解决方案是craw()方法中想办法,限定爬行深度和爬行网页数目,让它爬完整个网站就停止,有这种网络操作的线程也根本无法被中断掉。
  crawer()实际上使用的深度(纵向)爬取
2.排队这个更难理解,因为通常的java web应用都是请求响应式的,发现servlet和常见的ssh根本不适用眼下的情形。

----------------------------------------------------------------------------------

眼只有我一个人弄这个,精力实在有限。一个多线程就反复看了很多遍,越看越迷糊,结果是像这类带网络访问的没法暂停或停止,只能等它执行完后自己停掉。

想达到这样的一个效果,如果使用开源框架heritrix+lucene,就涉及到了radius和负载均衡之类的,如果想实现任务排队的,倒也有个rabbitMQ,技术多到眼花缭乱,也很不容易上手,而我的这个并不需要性能能有多高,这也是我为什么选用jsp+servlet来做的原因,只求能有点项目的模样。

只能寄希望各位开发大牛,只要能提供一点想法就非常感谢了。

如果你们有这样的一个需求,会考虑什么思路来做?

------解决方案--------------------
servlet里启动独立线程来爬取页面,把爬取进度什么的写到公共数据里,比如静态变量、数据库、文件,随便什么,web端定时刷新请求看爬取进度。