2012-01-03 11 views
0

Java 1.6の並行処理機能を使用して、オフラインでいくつかのタスクを実行しています。ユーザーが登録して作成されたとき、私は、ユーザーをブロックしたくないいくつかの社内ログタスク&を実行する必要があるので、私は以下のコードを使用してきたJavaのExecutorServiceによる同時実行

java.util.concurrent.ExecutorService myservice = Executors.newSingleThreadExecutor(); 
    myservice.execute(new myTask(user)); 

ここで、私が持っていますRunメソッドでRunnable &を実装する内部クラスmyTask、私はオフラインの活動をしています(非ブロッキング呼び出しとしてそれを作る)。

ユーザーがウェブサイトにログインすると、特定の操作(ウェブページ上のボタン)がクリックされ、同様のオフラインアクティビティを実行する必要があります。&私はブロッキングコールとして電話をかけたくありません。このページには、オフラインタスクを実行するために必要な4つのアクションがあります。

4つの異なる内部クラスで同様のコードを使用してもよろしいですか?&それらの中でオフライン活動を実行しますか?そうでない場合は、代替手段は何ですか?

ありがとうございます!

答えて

0

高水準の同時要求が予想されない場合は、エグゼキュータを使用できます。この場合はThread poolを使用してください。

あなたが非常に並行しているアプリケーションで、アクションの処理を保証する必要がある場合(jvmクラッシュの場合でも)、アクションをトランザクションにしたい場合は、メッセージング(JMS)がソリューションになる可能性があります。

私は、Webアプリケーションで以前に正常にプールでExecutorsを使用しました。ただし、スレッドはWebアプリケーションで作成することはお勧めしません。スレッドはコンテナによって管理されないため、EJBでは使用できません。

static final int POOL_SIZE=10; 
ExecutorService pool = Executors.newFixedThreadPool(POOL_SIZE); 

また、この素晴らしい記事読むことができます:あなたがスレッドよりも多くの作業が利用可能にさせるためのスレッドセーフなキューを使用する必要があり、あなたのスレッドプールへの追加でJava Concurrency

+0

私はstrutsアクション内でStruts2&を使用していますが、この実行スレッドはあります。あなたはスレッドプールを実装する方法のサンプルラインを提供することができますか?スレッドプールサイズを設定する必要がありますか?もしそうなら、どこ?私はtomcat 6サーバーを使用しています。 – Mike

+0

@Mikeはサンプルコードを追加しました。トレッドプールを一度だけ作成し、Webアプリケーションがシャットダウンする前にシャットダウンするようにする必要があります。 –

+0

私はまだこれらのAPIを使っていない。 newFixedThreadPoolが呼び出されたことがわかります。しかし、それでは、Runnableインターフェースを実装する内部クラスmyTaskをどのように呼び出すのでしょうか? pool.execute(new myTask(user))を呼び出す必要がありますか。また、10人以上のユーザーがウェブサイトにアクセスしようとするとどうなりますか? – Mike