2012-02-01 22 views
0

私は、応答を処理して返すために数分かかるサーブレットを持っています。多少制限された環境(Amazon Elastic Beanstalk)で実行されています。この環境では、要求時間に60秒の制限があり、これは設定できません。Javaサーブレットの接続タイムアウト

ここには何がありますか?私はサーブレットがスレッドを開始し、ブラウザにAJAXを使って投票をさせることを考えましたが、サーブレットがさまざまな理由でスレッドを開始することを非常に多くの人が推薦しています。

もう1つの解決策は、アプリケーションのコンテキストリスナーでスレッドの開始と終了を行うことですが、アプリ内にさまざまな機能を実行するさまざまなサーブレットがあります。これらのサーブレットにはすべて同じ問題があります。バックグラウンドで実行されている1つのスレッドは本当に役に立ちません。

提案がありますか?

編集:SOのさらなる研究を少し行い、Executor が私に必要なものであることがわかりました。

See BalusC's answer here

See skaffman's answer here

答えて

0

この問題を解決する最善の方法は、エグゼキュータを使用することです(私の質問の更新を参照)。私はこれを私のプロジェクトで使っており、シームレスに作業しています。

1

はい、programmaticaly servelet容器にスレッドを開始するためのベストプラクティスではありません。しかし、この制限はあまり厳しくありません。 IMHO本当に必要な場合はそれを行うことができます。しかし、そのようなソリューションを開始する場合は、それを段階的に実装してください。

最初に試してみてください。長いリクエストを処理するために新しいスレッドを開きます。処理中はサーブレットの「メイン」スレッドから何らかの「キープアライブ」を送信します。処理が完了すると、クライアントに応答を送信します。

おそらく、より長いスケーラビリティのソリューションは、長いリクエストの非同期処理にメッセージング(JMSなど)を使用することです。リクエストが受信されると、サーブレットはJMSメッセージを作成し、エンキューしてすぐに戻る必要があります。反対側(MessageListenerを実装する側)はメッセージを処理し、その結果を発信キューに入れるべきです。クライアントはこのキューから結果を要求する必要があります。これは明確な解決策です。クラスタ化されたマルチマシン環境で動作しますが、より多くの努力が必要です。

あなたの選択は、要件、リソース、時間によって異なります。

+0

+1と徹底的なレスポンスとJMS。しかし、私が探していた答えは、エグゼクティブのようなものでした(私の質問の編集を参照)。ありがとう。 – stepanian

+0

@stepanian、executorは魔法ではありません。これは、サーブレットコンテナによって管理されていないスレッドを間接的に作成することを意味するスレッドプールを使用します。 – AlexR