0

EJB でスレッドを作成する際に小さな問題があります。OK です。EJB でスレッドを使用できない理由は理解できますが、それらを同じ機能に置き換える方法がわかりません。30 ~ 40 の Web ページ/ファイルをダウンロードしようとしていますが、すべてのファイルのダウンロードを同時に (およそ) 開始します。キュー内の 1 つのスレッドでそれらを実行すると、3 分以上実行されるため、これが必要です。

@Asyncronious アノテーションを試してみましたが、何も起こりませんでした。

 public void execute(String lang2, String lang1,int number) {
            Stopwatch timer = new Stopwatch().start();
            htmlCodes.add(URL2String(URLs.get(number)));
            timer.stop();
            System.out.println(  number +":"+ Thread.currentThread().getName() + timer.elapsedMillis()+"miseconds");
        }
private void findMatches(String searchedWord, String lang1, String lang2) {
    articles = search(searchedWord);
    for (int i = 0; i < articles.size(); i++) {

        execute(lang1,lang2,i);
    }
4

1 に答える 1

0

役立つ2つの非常に優れたSOの回答を次に示します。 これはオプションを提供、ejb でスレッドを生成してはならない理由を説明しています。最初の回答の問題は、EJB 3.0 オプションに関する知識があまり含まれていないことです。そこで、@Asynchronous の使用に関するチュートリアルを次に示します。

問題はありませんが、このチュートリアルをまだ読んだという証拠はコードにありません。非同期メソッドは を返す必要がありFutureます。 チュートリアルが言うように

クライアントは、Future.get メソッドの 1 つを使用して結果を取得できます。呼び出しを処理するセッション Bean によって処理が完了していない場合、 get メソッドの 1 つを呼び出すと、クライアントは呼び出しが完了するまで実行を停止します。get メソッドの 1 つを呼び出す前に、Future.isDone メソッドを使用して処理が完了したかどうかを判断します。

于 2013-07-17T19:33:42.173 に答える