Spring MVCを使用すると、外部サービスへのAPI要求を作成するコントローラがあり、時間がかかることがあります。私は外部の要求結果をユーザーに返すため、これを同期して実行しています。理想的には、これは、この間にスレッド全体をブロックするものではなく、非同期/待機C#スタイルのイディオムのようなものですが、Spring(または他のもの)で簡単に行う方法がわかりません。Spring MVCコントローラで長時間実行されるプロセスを処理する
答えて
非同期実行のサービスメソッドでは、@Async注釈を使用できます。
Spring MVCはサーブレットの上に構築されているため、コントローラメソッド内で行うことは、Tomcatが提供するリクエストスレッドをブロックすることになります(Tomcatは最近のSpring Bootのデフォルトサーブレットコンテナです)。 別のHTTPベースのサービスを呼び出す場合、またはコントローラ内のデータベースを照会する場合は、おそらくブロッキングIO呼び出しを行っている可能性があります。ブロッキングコールは常に呼び出しスレッドをブロックし、C#のasync/awaitはSpring @Asyncのように文法上の砂糖だけです。実際の作業を行うために隠されたThreadPoolを使用します。
NIOセレクタを使用してアップストリームサービスを呼び出すことができない限り、応答を待つスレッドが必要です。この場合、Tomcatリクエストスレッドをブロックするのが最も理にかかります。デフォルト要求スレッドの数は150ですが、必要に応じてより高く設定できます。上流サービスをNIO方式で呼び出すことができる場合は、そのサービスへのすべての呼び出しに1つのスレッドしか必要なく、コントローラからDeferedResult
を返すことができ、上流サービスからの応答に生産された。
簡単です。あなたのメインコントローラメソッドから長時間実行しているAPIを呼び出さないでください。ビュー(JSP)を返すだけです。その後、ビュー(JavaScript)でdocument.ready
メソッドからajaxリクエストを発生させることができます。 ajax呼び出しを処理するには、コントローラーに別途@ResourceRequest
注釈付きメソッドを持たせることができます。 apiの結果(JSONなど)をajax呼び出し側に返します。ビューがajaxレスポンスを受け取ったら、必要に応じてUIを更新します。
- 1. スプリングステートマシン - 長時間実行されるプロセスを管理する
- 2. スリープ長時間実行されるプロセス
- 3. 長時間実行されているWebリクエストの処理
- 4. ASP.Netアプリケーションで長時間実行されるプロセスを処理する最善の方法は何ですか?
- 5. RxJavaで長時間実行するタスクを処理する
- 6. 長時間実行されるプロセスに使用できるHTTPClient
- 7. WCFで長時間実行されるプロセスを扱う
- 8. ブラウザでPHPが長時間実行されているプロセス
- 9. iOS4のバックグラウンドで長時間実行され続けるプロセス
- 10. Ubuntuで長時間実行されているバッチ処理が遅いです。
- 11. 長時間実行されるプロセスの.NET自動テスト
- 12. Akkaのアクターパターンと長時間実行されるプロセス
- 13. 長時間実行されるプロセス(Python)のタイムアウトとWindowsサービス
- 14. Springシェルで長時間実行されているコマンドの実行中断
- 15. Apache Igniteで長時間実行され、大規模なバッチ処理が可能
- 16. コントローラで処理されたSpring MVCで@ModelAttributeをリセットするには?
- 17. Spring MVCコントローラが複数の長いHTTPリクエストを処理する方法は?
- 18. ASP.Net長時間実行されるプロセスのタイムアウトを防止する
- 19. 別のバックグラウンドスレッドとプロセスで長時間のバックグラウンドタスクを実行する
- 20. 長時間実行するプロセスのWinformsでモーダルロードウィンドウを表示
- 21. PHPを別のプロセスで長時間実行する
- 22. 長時間実行されるタスクを実行するフレームワーク
- 23. グリッド(純粋なJS)で長時間処理を処理する
- 24. 長時間実行するプロセスをパイプする
- 25. 長時間実行中のジョブSpring
- 26. NodeJSで長期実行プロセスを処理しますか?
- 27. Spring MVCコントローラで例外を処理する
- 28. ASP.NETで長時間実行されるバックグラウンドプロセス - Application_Startまたは別のプロセス?
- 29. サービスワーカー(または同様のもの)内で長時間実行されるプロセス
- 30. 長時間実行アクションasp.net core mvc
ありがとうございます。残念ながらAFAIKはスレッドプール上で非同期タスクをスピンアウトし、結果をクライアント要求に返す唯一の方法は、リクエストスレッドをブロックするFutureに対してcal get()を実行することです –