2016-11-24 6 views
1

私はこれをしていますtutorial方法についてリターンasync呼び出し可能オブジェクト。意図したとおりに動作します。 最初の要求が5秒間スリープしている間に、コントローラは、前のフィンランド語の要求に対してはを待ってから2番目の要求を処理します。RESTコントローラはマルチスレッドですか?

どのようにコントローラがバックグラウンドですぐにリクエストを処理し、寝るのか?

@Edit

例: は私のコントローラは、外部APIへのリクエストを作成する必要があり、その応答に基づいて、それは彼自身の応答を送信する必要があること、状況を想像してみてください。外部APIコールには2秒と言います。コントローラは一度に1つの要求しか処理できないため、私のアプリケーションのユーザーは2.5秒待ってキューに入れないようにします。

+0

まだ回答はありませんか? http://stackoverflow.com/questions/35196157/spring-non-blocking-rest-send-and-forget –

答えて

4

RESTコントローラはマルチスレッドですか?

DisptcherServletはクライアントからの複数の要求を同時に処理し、それぞれのコントローラメソッドを使用して処理するため、RESTコントローラはマルチスレッド化されています。あなたはhere

すぐにすべての要求をコントローラハンドルを作成し、バックグラウンドで 睡眠にする方法

を要求処理フローを参照することができますか?

@Controller 
public class MyController { 

    @RequestMapping(value="/sleep") 
    public Callable<String> myControllerMethod() { 
     Callable<String> asyncTask =() -> { try { 
      System.out.println(" WAITING STARTED:"+new Date()); 
      Thread.sleep(5000); 
      System.out.println(" WAITING COMPLETED:"+new Date()); 
      return "Return";//Send the result back to View Return.jsp 
     } catch(InterruptedException iexe) { 
      //log exception 
      return "ReturnFail"; 
     }}; 
    return asyncTask; 
    } 

出力:

をWAITINGがSTARTED:木11月24日午後九時03分12秒GMT 2016あなたは、以下のように春のコントローラメソッドでCallable<String>を返すことによってそれを行うことができます

待ち合わせ済み:11月24日21:03:17 GMT 2016

この後、ビューは "Return.jsp"ページに戻ります。

ここでコントローラメソッドは別のスレッド(実際のサーブレットスレッドを解放する)で実行され、タスクが完了するとResultがクライアントに再度送り返されます(Viewなど..)。

P.S:あなたは、あなたがこの上hereを見ることができ、あなたのアプリケーション構成の一部として@EnableAsyncを追加する必要があります。あなたが何をしたいか

+0

5秒後に返信したいのですが、ただちに – Humberd

+0

私は自分の答えを更新しました。 – developer

+0

私はすでにそれを試みましたが、POSTMANを使用してリクエストを送信すると、応答は直後に(11ms)表示されます。それはまったく待つことはありません – Humberd

0

は、あなたがリンクされ、チュートリアルの最初の例で行われることになっているものです。それが行われ

@RequestMapping(value = "/block", method = RequestMethod.GET, produces = "text/html") 
public String executeSlowTask() { 
    logger.info("Request received"); 
    Thread.sleep(5000); 
    logger.info("Servlet thread released"); 

    return result; 
} 

このブロック呼び出し元のスレッドを待ちまで。別のHTTPセッションから呼び出すと、それは別のスレッドになるため、新しい5秒間の待機になります(最初のセッションの影響を受けません)。

スレッドはプール内で使用可能なスレッド(Tomcatサーバーの構成)がある限り、HTTP呼び出しにリンクされます。

ビジー状態でコントローラが後続のすべてのコールをブロックすることはありません。マルチスレッド化されています。

+0

私のために、それはすべてのincomming要求をブロックします – Humberd

+0

あなたは何らかの設定問題を持っています。仮想マシンや別の種類の制限された環境にいますか? – Fernando

+0

いいえ、すべての管理者権限を持つ私の個人用コンピュータにあります – Humberd

関連する問題