0

我有一个网络爬虫,其中基本布局是一个管理器,它运行打开连接、获取内容并将其插入数据库的代理。

这些代理中的每一个都在循环中的单独线程中运行,直到用户发送停止信号。这些代理从管理代理获取任务。

问题是如果代理中发生异常,它不能被抛出到接口(除非我使用一些观察者来表示发生了异常)。

我认为这种设计是错误的,正确的是创建一个有限的任务并将它们放入执行程序(为每个 URL 创建一个任务以打开连接、获取内容或插入数据库)。

我是对的,我目前的设计是错误的,必须改变布局?在不同的代理完成工作的不同部分的情况下,多线程使用的正确布局是什么?

4

1 回答 1

4

是的,我认为您应该使用Executors. 如果你提交Callable类,你可以从你的蜘蛛代理中抛出并检查返回的Future结果,这会导致异常被抛出给作业提交者,以便它可以被记录或显示到你的 UI。

ExecutorService pool = Executors.newFixedThreadPool(10);
Future<Void> future = pool.submit(new Callable<Void>() {
    public Void call() throws Exception {
       // your agent code goes here
       // this can throw an exception in this block which will be re-thrown below
       return null;
    }
});
...
try {
   // then the exception will be thrown here for you to catch and log
   future.get();
} catch (ExecutionException e) {
   // log the e.getCause() here
}
...
pool.shutdown();
于 2012-04-10T14:34:51.173 回答