2012-01-19 12 views
1

私は、Crystalレポートを使ってレポートを生成できるWebアプリケーション(java、tomcat)を持っています。問題は、ユーザーが完了するのに時間がかかる巨大なレポートをリクエストした場合、私のアプリケーション全体が停止することです。このようなリクエストを停止する方法はありますか?5分後に完了していないとしたらどうですか?速度を最適化し、レポートのサイズを制限する以外に、他の回避策はありますか?サーバリクエストの停止

+0

_Why_が停止するアプリケーショングラインドていますか? –

+0

レポートの生成がtomcatのCPUとmemomeyリソースを突っ込んでいると思うので – ha1ogen

+1

トランザクションシステムでこのようなレポートを実行するのは良い考えではありません - 再設計について考えるべきです... – home

答えて

2

あなたは別のスレッドでレポート生成を実行していないと思います。別のスレッドでレポート生成を実行し、準備ができたらリンクをユーザーに送り返す方がよいでしょう。

javaのExecutorServiceを使用して、スレッドにタイムアウトを設定することができます。また、割り当てられた時間を超えると期限切れになります。 JavaのExecutorServiceの、未来のための

検索、呼び出し可能なチュートリアル

サンプルコード:

Callable<Integer> callable = new CallableImpl(2); 
    ExecutorService executor = new ScheduledThreadPoolExecutor(5); 
    Future<Integer> future = executor.submit(callable); 
    Integer result = future.get(600,TimeUnit.seconds)); 
+0

ありがとう私はこれを見ていきます – ha1ogen

1

もう1つの方法は、別のスレッドでレポート生成を実行するか(またはExecutorServiceを使用して)、生成時間があるしきい値を超えるとThread.interrupt()を呼び出します。 I/O(ネットワーク、データベース)上で現在ブロックされている場合、スレッドは中断される可能性があります。