2017-02-19 25 views
0

Spring MVCを使用すると、外部サービスへのAPI要求を作成するコントローラがあり、時間がかかることがあります。私は外部の要求結果をユーザーに返すため、これを同期して実行しています。理想的には、これは、この間にスレッド全体をブロックするものではなく、非同期/待機C#スタイルのイディオムのようなものですが、Spring(または他のもの)で簡単に行う方法がわかりません。Spring MVCコントローラで長時間実行されるプロセスを処理する

答えて

1

非同期実行のサービスメソッドでは、@Async注釈を使用できます。

+0

ありがとうございます。残念ながらAFAIKはスレッドプール上で非同期タスクをスピンアウトし、結果をクライアント要求に返す唯一の方法は、リクエストスレッドをブロックするFutureに対してcal get()を実行することです –

0

Spring MVCはサーブレットの上に構築されているため、コントローラメソッド内で行うことは、Tomcatが提供するリクエストスレッドをブロックすることになります(Tomcatは最近のSpring Bootのデフォルトサーブレットコンテナです)。 別のHTTPベースのサービスを呼び出す場合、またはコントローラ内のデータベースを照会する場合は、おそらくブロッキングIO呼び出しを行っている可能性があります。ブロッキングコールは常に呼び出しスレッドをブロックし、C#のasync/awaitはSpring @Asyncのように文法上の砂糖だけです。実際の作業を行うために隠されたThreadPoolを使用します。

NIOセレクタを使用してアップストリームサービスを呼び出すことができない限り、応答を待つスレッドが必要です。この場合、Tomcatリクエストスレッドをブロックするのが最も理にかかります。デフォルト要求スレッドの数は150ですが、必要に応じてより高く設定できます。上流サービスをNIO方式で呼び出すことができる場合は、そのサービスへのすべての呼び出しに1つのスレッドしか必要なく、コントローラからDeferedResultを返すことができ、上流サービスからの応答に生産された。

0

簡単です。あなたのメインコントローラメソッドから長時間実行しているAPIを呼び出さないでください。ビュー(JSP)を返すだけです。その後、ビュー(JavaScript)でdocument.readyメソッドからajaxリクエストを発生させることができます。 ajax呼び出しを処理するには、コントローラーに別途@ResourceRequest注釈付きメソッドを持たせることができます。 apiの結果(JSONなど)をajax呼び出し側に返します。ビューがajaxレスポンスを受け取ったら、必要に応じてUIを更新します。

関連する問題