0

基本的なレイアウトが、接続を開き、コンテンツをフェッチしてデータベースに挿入するエージェントを実行するマネージャーであるWebクローラーがあります。

これらのエージェントはそれぞれ、ユーザーが停止信号を送信するまで、ループ内の個別のスレッドで実行されます。これらのエージェントは、マネージャーエージェントからタスクを取得します。

問題は、エージェントで例外が発生した場合、それをインターフェイスにスローできないことです(例外が発生したことを通知するためにオブザーバーを使用しない限り)。

この設計は間違っていると思います。正しいのは、有限のタスクを作成してエグゼキューターに配置することです(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 に答える