Java定时启动任务以及Heritrix超时处理

 

Timer timer = new Timer(); timer.schedule(new TimerTask() { public void run() { try{ /** *your code */ /*for test System.out.println("Start " + count++); BufferedInputStream is = new BufferedInputStream(System.in); is.read(); System.out.println("end");*/ } catch(Exception e){ e.printStackTrace(); } } }, 0, 1000);

通过在以上代码run()内写上想定期执行的代码即可。一下是jdk中对Timer类的描述:

public class Timer
    
    
    
    
extends Object

一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。

与每个 Timer 对象相对应的是单个后台线程,用于顺序地执行所有计时器任务。计时器任务应该迅速完成。如果完成某个计时器任务的时间太长,那么它会“独占”计时器的任务执行线程。因此,这就可能延迟后续任务的执行,而这些任务就可能“堆在一起”,并且在上述不友好的任务最终完成时才能够被快速连续地执行。

 

运行test部分的代码可知,Timer会等待上一个任务完成了才开始执行下一个任务。所以定期执行的代码要处理好超时问题。例如我定期执行Heritrix怕取任务,但有时Heritrix会‘卡死’在某一个网页上:

信息: Processor: Scheduler --> org.archive.crawler.postprocessor.FrontierScheduler
2011
-5-9 15:31:38 org.archive.crawler.fetcher.FetchHTTP innerProcess
信息: GET http://www.XXXXX.com/XXXXXX/index.htm 200 20909 text/html;charset=GB

经常是执行完信息: Processor: Scheduler --> org.archive.crawler.postprocessor.FrontierScheduler后就一直停住,通过设置<integer name="timeout-seconds">1200</integer>这个参数也没用(如果抓取在规定时间内(秒)没有完成,即使它还正在处理中,也是放弃。),后来处理超时的方法是设置<long name="max-time-sec">600</long>让Heritrix在规定时间内还没结束任务则强制结束(最大时间抓取(秒),如果抓取时间超过该值,则爬虫将停止抓取。如果该值为0则表示没有限制)。

你可能感兴趣的:(java,exception,timer,object,Integer,任务)