2017-09-14 28 views
5

Używam Spring Boot to build a RESTful web service. Moje IDE to Eclipse Oxygen.Spring-Boot: Obsługuj wiele żądań jednocześnie

wyślę wielu żądań HTTP GET w co 2 sekundy przez Chrome, ale są one wywołane pojedynczo. Każde żądanie będzie czekać na zakończenie poprzedniego żądania.

Oto mój kod kontrolera:

@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); 
    } 
} 

Moja konsola out put jest:

wyjście
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 

Konsola pokazuje, że kontroler jest nazywany co 5 sekund. Ale wysyłam żądania co 2 sekundy.

Jak mogę obsłużyć jednocześnie wiele przychodzących żądań? (Powinny widzę wyjścia konsoli co 2 sekundy)

UPDATE:

Gdybym wysyłania żądań w różnych przeglądarkach, to działa doskonale. Jeśli testuję go w tej samej przeglądarce/aplikacji, która dzieli sesję, problem zostanie ujawniony.

Czy można akceptować równoczesne wielokrotne żądania od w tej samej sesji?

Dzięki!

+0

Nie mogę tego odtworzyć. Domyślnie aplikacje sieciowe Spring Boot są wielowątkowe i obsługują jednocześnie wiele żądań. Korzystasz z programu Embedded Tomcat? Czy zmieniłeś jakieś domyślne ustawienia wątków (np. 'Server.tomcat.max-threads')? –

+0

@KyleAnderson kod działa poprawnie, jeśli wysyłam żądania z różnych przeglądarek. Problem pojawia się, gdy wysyłam żądania (otwarte karty) w tej samej przeglądarce. Zaktualizowałem sprawdzanie poczty. ty! –

+0

To _może być specyficznym dla przeglądarki dziwactwem. W systemie Windows 10 wydaje się, że Chrome i Firefox umieszczają wiele żądań w tym samym adresie URL, podczas gdy IE, Edge i curl nie. –

Odpowiedz

4

Domyślnie aplikacje internetowe Spring Boot są wielowątkowe i obsługują wiele żądań jednocześnie.

To może być specyficzna przeglądarka. Na Windows 10, Chrome & Firefox wydaje się kolejkować wiele żądań do tego samego adresu URL, podczas gdy IE, Edge, & curl nie.

-3

Fasolka szparagowa to domyślnie fasola pojedyncza. Singleton oznacza jedno wystąpienie obiektu na pojemnik. Tak naprawdę istnieje jeden przypadek DummyController w jednym kontenerze. Pojawia się pierwsze żądanie i wątek przechodzi w stan uśpienia na 5 sekund. Po jego pobudzeniu następuje całkowite wykonanie i obiekt zostaje zwolniony, co zostanie odebrane przez drugie żądanie. Zaznacz Is REST controller multithreaded?

+0

Jeśli tak jest, to w jaki sposób Spring-Boot obsługuje jednocześnie wiele żądań? –

+4

Podczas gdy 'Controller' bean jest' Singleton', to nie wyklucza, że ​​jego metody są dostępne dla wielu wątków.W rzeczywistości, Spring Boot Servlet Container jest wielowątkowy, a zatem wielokrotne żądania mogą być przetwarzane jednocześnie. –