当前位置: 首页 > SEO博客 > java自动任务中超时的处理方法

java自动任务中超时的处理方法

时间:2011-11-17 23:11:25
随着SEOTcs的逐步开发,发现有些自动任务在获取特定值的时候特别耗时间,有时一个整体批量的任务会被某些耗时的程序卡在那里了,导致整个自动脚本任务的悬挂,影响了一些页面上的某些参数的显示。

自动任务脚本中,大部分参数是需要通过建立网络连接来执行的,往往受到的因素会很多,网速原因,页面原因,程序原因等,都有可能导致程序结果有去无回,因此使得程序悬挂,导致整体任务受影响,这个是绝对不允许的,客观上来说,客户看到一些数据没加载到,会觉得这个软件不好用,就会离开,导致web软件平台用户使用的流失率增加。

因此,有必要对单个程序单元设置一个超时的限制,如果单个程序在执行过程中超过指定的时间,则视为未获取到,从而保证整个程序执行的连贯性,保证大部分数据是完整和有效的。原来以为使用java中的Timer类,其实不然,那个是对于定时做某个任务有帮助,后来在网上找了一下,发现了一个比较好的解决办法,可以很好的解决好设置程序执行超时的问题。在java中,jdk1.5自带的并发库中Future类就能满足这样的一个需求。Future类中重要方法包括get()和cancel()。其中,get()获取数据对象,如果数据没有加载,就会阻塞直到取到数据, cancel()则是取消数据的加载。另外一个get(timeout)操作,表示如果在timeout时间内没有取到就失败返回,而不再阻塞,采用这个方法一般就会解决不少问题。

例如,我们在程序中有一个比较耗时的程序,名字叫getAlexaRank,则通过限时来获取结果的一个程序就可以写成:

public static final String getTimerAlexa(final String domain){
String obj ="-1";
ExecutorService exec = Executors.newFixedThreadPool(1);
Callable<String> call = new Callable<String>() {
public String call() throws Exception {
return getAlexaRank(domain);
}
};
try {
Future<String> future = exec.submit(call);
obj = future.get(1000*10, TimeUnit.MILLISECONDS);
log.info(domain+" Alexa Rank Task with success:" + obj);
} catch (TimeoutException ex) {
log.info("Alexa Rank Time out with url : "+domain);
} catch (Exception e) {
log.info(domain+" Alexa Rank Failure with Exception");
}
exec.shutdown();
return obj;
}

如果getAlexaRank这个方法执行超过了10秒,则程序自动返回一个值,及时退出程序,避免了程序长时间的被拖住,影响程序效率甚至其它重要功能程序的执行。
分享按钮