3

みなさん、こんにちは。フォーラムは初めてですが、SpringのcommonjWorkManagerTaskExecutorの操作について質問がありました。私はこのテーマに関するより良い情報を探しているたくさんのフォーラムに参加していますが、このテーマに関する詳細な情報は何も見ていません。これが私の状況です。

私のアプリケーションは、ThreadPoolTask​​Executorによって処理されていた複数のスレッドを使用しています。これは、Websphere 7.0アプリケーションサーバーを使用しているため、友人が正しい選択ではないと私に言ったものです。すべてが正しく機能し、若干の調整を加えることで、ThreadPoolTask​​ExecutorをWorkManagerTaskExecutorに置き換えることができました。アプリケーションを実行すると、Websphereサーバーのデフォルトのワークマネージャーを介してスレッドが起動します。発生しているように見える問題は、workManagerTaskExecutor.waitForAll(collection、timeout);を使用しているにもかかわらずです。スレッドが完了するのを実際に待つことはありません。スレッドがそれぞれのメソッドを実行していることは機能していることを私は知っています。なぜなら、このすべての後に長いforループを発行すると、データはそこにあり、そうでない場合はデータがないからです。

  1. WorkManagerTaskExecutorは進むべき道ですか?または、エンタープライズWebアプリケーションで複数のスレッドを処理するには、ThreadPoolTask​​Executorを使用するだけで十分でしょうか。

  2. WorkManagerTaskExecutorが進むべき道である場合は?なぜwaitForAllメソッドがメソッドが実行されたかのように完了するのかについてのアイデアはありますか?明らかにそうではないのはいつですか?ページが読み込まれた後、ログでメソッドがまだ実行中であり、最終的には完了していることがわかります。

どんな助けでも大歓迎です。私が何かを省略した場合、私は喜んで問題についてより多くの情報を提供しようとします。私は与えられるかもしれないどんな助けにも心から感謝します。

前もって感謝します、

明細書

4

2 に答える 2

3

JavaSE に組み込まれているjava.util.concurrent.Executorインターフェースを拡張して並行クラスを実装する必要があります。次に、 Spring IoC コンテナーを使用して、 Websphere で実行しているときにWorkManagerTaskExecutorの実装クラスに注入できます。

これにより、別の Java アプリ サーバーで実行したい場合に柔軟性が得られます。また、コンテナーの外部で JVM で直接実行する場合でも機能します。これは、ThreadPoolTask​​Executorを挿入でき、コードを変更する必要がないためです。

メソッドを使用するなど、CommonJ WorkManager API (JSR 237) に対して直接コーディングすることは避ける必要がwaitForAllあります。これは、IBM Websphere および Oracle WebLogic でのみ機能するためです。

于 2012-05-12T02:08:58.637 に答える
0

私にとってこの問題に対する最終的な勝利の組み合わせは次のとおりです。

List<Callable<?>> callables = new ArrayList<Callable<?>>();
    List<Future<?>> futures = new ArrayList<Future<?>>();
    for (int i = 0; i<callers.length;i++){
        callables.add(new MainTaskExecutor(this,entity,callers[i]));

    }
    for (Callable c:callables){
        futures.add(workTaskExecutor.submit(c));
    }
    for (Future<?> f:futures){
        do{}while(!f.isDone());
    }
于 2012-05-14T18:24:41.070 に答える