2017-09-14 143 views
5

私はSpring Boot to build a RESTful web serviceを使用しています。私のIDEはEclipse Oxygenです。Spring-Boot:複数のリクエストを同時に処理する

私はクロームを通じて2秒ごと複数 HTTP GETリクエストを送信するが、彼らは1によって1を誘発しています。各リクエストは、前のリクエストが完了するまで待機します。

Thu Sep 14 11:31:15 EDT 2017: ThreadId 25 
Thu Sep 14 11:31:20 EDT 2017: ThreadId 26 
Thu Sep 14 11:31:25 EDT 2017: ThreadId 28 
Thu Sep 14 11:31:30 EDT 2017: ThreadId 30 

コンソール出力はコントローラが5秒ごとと呼ばれていることを示しています

@RestController 
@RequestMapping("/dummy") 
public class DummyController { 
    @RequestMapping(method = RequestMethod.GET) 
    public ResponseEntity<Map<String, String>> dummytsp(@RequestParam(value="msg", defaultValue="Hello") String msg) { 
     System.out.println("" + new Date() + ": ThreadId " + Thread.currentThread().getId()); 

     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     Map<String, String> response = new HashMap<>(); 
     response.put("message", msg); 
     return new ResponseEntity<>(response, HttpStatus.OK); 
    } 
} 

マイコンソールアウトプットは次のとおりです。

は、ここに私のコントローラのコードです。しかし、私はの2秒ごとにのリクエストを送信しています。

複数の着信要求を同時に処理する方法はありますか。

UPDATE(私は2秒ごとにコンソール出力が表示されるはずです):私は別のブラウザにリクエストを送信する場合

を、それが完璧に動作します。 セッションを共有する同じブラウザ/アプリケーションでテストすると、問題が発生します。

同じセッションから複数の同時リクエストを受け入れることはできますか?

ありがとうございます!

+0

私はこれを再現できません。デフォルトでは、SpringブートWebアプリケーションはマルチスレッドであり、複数の要求を同時に処理します。 Embedded Tomcatを使用していますか?デフォルトのスレッド設定(たとえば 'server.tomcat.max-threads')を変更しましたか? –

+0

@KyleAnderson私は別のブラウザから要求を送信する場合、コードが正常に動作します。同じブラウザでリクエスト(開いているタブ)を送信すると、問題が表示されます。私は私のポストplsのチェックを更新しました。タイ! –

+0

これはブラウザ固有の特質である可能性があります。 Windows 10では、ChromeとFirefoxは複数のリクエストを同じURLにキューイングしているようですが、IE、Edge、およびカールはそうではありません。 –

答えて

4

デフォルトでは、SpringブートWebアプリケーションはマルチスレッドであり、複数の要求を同時に処理します。

これはブラウザ固有のものかもしれません。 Windows 10では、Chrome & FirefoxはIE、Edge、& curlは同じURLに複数のリクエストをキューしているようです。

-3

デフォルトでは、Spring BeanはシングルトンBeanです。シングルトンとは、コンテナごとに1つのオブジェクトインスタンスを意味します。実際には、1つのコンテナにDummyControllerのインスタンスが1つあります。最初のリクエストが到着し、スレッドが5秒間スリープ状態になります。一度起動するとオブジェクトが解放され、2回目の要求でピックアップされます。チェックIs REST controller multithreaded?

+0

これは、Spring-Bootが同時に多くの要求をどのように処理するのでしょうか? –

+4

'Controller' Beanは' Singleton'ですが、複数のスレッド間でそのメソッドにアクセスすることを排除するものではありません。実際には、Springブートサーブレットコンテナはマルチスレッドであるため、複数の要求を同時に処理することができます。 –

関連する問題